@gmickel/gno 1.45.0 → 1.46.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.
@@ -742,12 +742,14 @@ Install GNO as MCP server in client configurations.
742
742
  gno mcp install [options]
743
743
  ```
744
744
 
745
- | Option | Default | Description |
746
- | -------------- | -------------- | ------------------------- |
747
- | `-t, --target` | claude-desktop | Target client (see below) |
748
- | `-s, --scope` | target default | Scope: `user`, `project` |
749
- | `-f, --force` | false | Overwrite existing config |
750
- | `--dry-run` | false | Preview changes |
745
+ | Option | Default | Description |
746
+ | ---------------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
747
+ | `-t, --target` | claude-desktop | Target client (see below) |
748
+ | `-s, --scope` | target default | Scope: `user`, `project` |
749
+ | `-f, --force` | false | Overwrite existing config |
750
+ | `--dry-run` | false | Preview changes |
751
+ | `--enable-write` | false | Registered server starts with write tools enabled |
752
+ | `--tool-profile` | full | Advertised tool set the registration starts with: `core` (7 read tools, plus `gno_capture` and `gno_remember` with `--enable-write`) or `full`; omitted writes no flag |
751
753
 
752
754
  Targets: `claude-desktop`, `claude-code`, `codex`, `cursor`, `zed`,
753
755
  `windsurf`, `opencode`, `amp`, `lmstudio`, and `librechat`. Project scope is
@@ -763,6 +765,12 @@ gno mcp install
763
765
  # Claude Code (user scope)
764
766
  gno mcp install -t claude-code
765
767
 
768
+ # Claude Code on the slim core profile, with capture and remember enabled
769
+ gno mcp install -t claude-code --tool-profile core --enable-write
770
+
771
+ # Switch an existing registration to core (nothing migrates on its own)
772
+ gno mcp install -t cursor --tool-profile core --force
773
+
766
774
  # Claude Code (project scope)
767
775
  gno mcp install -t claude-code -s project
768
776
  ```
@@ -100,7 +100,10 @@ gateway) advertises only `gno_query`, `gno_search`, `gno_get`, `gno_multi_get`,
100
100
  `gno_context`, `gno_changes`, and `gno_recall`, plus `gno_capture` and
101
101
  `gno_remember` with `--enable-write`; their descriptions state when to call
102
102
  each and what comes back. Every other tool named below is available under the
103
- default `full` profile.
103
+ default `full` profile. Pick the profile once per client at install time with
104
+ `gno mcp install --target <client> --tool-profile core` (add `--force` to
105
+ switch an existing registration); `gno mcp status` shows the profile each
106
+ registration carries.
104
107
 
105
108
  For normal questions, start with `gno_query`, then read targeted snippets with
106
109
  `gno_get` or batch refs with `gno_multi_get`. Use `gno_context` for one bounded,
@@ -0,0 +1 @@
1
+ 303bbadcb92766b35c3b21aaf66ac959b36679159e90014a06499ff6a84e5708 gno-browser-clipper-v1.46.0.zip
@@ -21,5 +21,5 @@
21
21
  "content_security_policy": {
22
22
  "extension_pages": "script-src 'self'; object-src 'none'; connect-src http://127.0.0.1:*"
23
23
  },
24
- "version": "1.45.0"
24
+ "version": "1.46.0"
25
25
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gmickel/gno",
3
- "version": "1.45.0",
3
+ "version": "1.46.0",
4
4
  "description": "Local semantic search for your documents. Index Markdown, PDF, and Office files with hybrid BM25 + vector search.",
5
5
  "keywords": [
6
6
  "embeddings",
package/spec/cli.md CHANGED
@@ -2466,17 +2466,19 @@ Install gno as an MCP server in client configurations.
2466
2466
  **Synopsis:**
2467
2467
 
2468
2468
  ```bash
2469
- gno mcp install [--target <target>] [--scope <scope>] [--force] [--dry-run] [--json]
2469
+ gno mcp install [--target <target>] [--scope <scope>] [--force] [--dry-run] [--enable-write] [--tool-profile <core|full>] [--json]
2470
2470
  ```
2471
2471
 
2472
2472
  **Options:**
2473
2473
 
2474
- | Option | Type | Default | Description |
2475
- | ----------- | ------- | -------------- | --------------------------------------------------------- |
2476
- | `--target` | string | claude-desktop | Target client (see table below) |
2477
- | `--scope` | string | target default | Scope: `user` or `project`; LibreChat defaults to project |
2478
- | `--force` | boolean | false | Overwrite existing gno configuration |
2479
- | `--dry-run` | boolean | false | Show what would be done without changes |
2474
+ | Option | Type | Default | Description |
2475
+ | ---------------- | ------- | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
2476
+ | `--target` | string | claude-desktop | Target client (see table below) |
2477
+ | `--scope` | string | target default | Scope: `user` or `project`; LibreChat defaults to project |
2478
+ | `--force` | boolean | false | Overwrite existing gno configuration |
2479
+ | `--dry-run` | boolean | false | Show what would be done without changes |
2480
+ | `--enable-write` | boolean | false | Start the registered server with write tools enabled |
2481
+ | `--tool-profile` | string | full | Advertised tool set written into the registration: `core` (7 read tools, plus capture and remember with `--enable-write`) or `full`; omitted writes no flag |
2480
2482
 
2481
2483
  **Targets:**
2482
2484
 
@@ -6,6 +6,10 @@
6
6
 
7
7
  import { DEFAULT_INDEX_NAME } from "../../../app/constants.js";
8
8
  import { getConfigPaths, toAbsolutePath } from "../../../config/paths.js";
9
+ import {
10
+ type McpToolProfile,
11
+ parseMcpToolProfile,
12
+ } from "../../../mcp/tool-profile.js";
9
13
  import { CliError } from "../../errors.js";
10
14
  import { getGlobals } from "../../program.js";
11
15
  import { resolveMcpConfigLocation } from "./config-discovery.js";
@@ -45,6 +49,8 @@ export interface InstallOptions {
45
49
  force?: boolean;
46
50
  dryRun?: boolean;
47
51
  enableWrite?: boolean;
52
+ /** Advertised tool set written into the registration (`core` or `full`). */
53
+ toolProfile?: McpToolProfile;
48
54
  /** Index identity persisted in the installed MCP command. */
49
55
  indexName?: string;
50
56
  /** Active GNO config persisted as a canonical absolute path. */
@@ -166,6 +172,18 @@ function safeGetGlobals(): { json: boolean; quiet: boolean } {
166
172
  }
167
173
  }
168
174
 
175
+ /** Validate the requested profile before any config file is read or written. */
176
+ function parseInstallToolProfile(value: unknown): McpToolProfile | undefined {
177
+ try {
178
+ return parseMcpToolProfile(value);
179
+ } catch (error) {
180
+ throw new CliError(
181
+ "VALIDATION",
182
+ error instanceof Error ? error.message : String(error)
183
+ );
184
+ }
185
+ }
186
+
169
187
  /**
170
188
  * Install gno MCP server.
171
189
  */
@@ -175,6 +193,7 @@ export async function installMcp(opts: InstallOptions = {}): Promise<void> {
175
193
  const force = opts.force ?? false;
176
194
  const dryRun = opts.dryRun ?? false;
177
195
  const enableWrite = opts.enableWrite ?? false;
196
+ const toolProfile = parseInstallToolProfile(opts.toolProfile);
178
197
  const indexName = opts.indexName ?? DEFAULT_INDEX_NAME;
179
198
  const paths = getConfigPaths();
180
199
  const configPath = toAbsolutePath(
@@ -196,6 +215,7 @@ export async function installMcp(opts: InstallOptions = {}): Promise<void> {
196
215
  // Build server entry (uses process.execPath, always succeeds)
197
216
  const serverEntry = buildMcpServerEntry({
198
217
  enableWrite,
218
+ toolProfile,
199
219
  indexName,
200
220
  configPath,
201
221
  dataDir: toAbsolutePath(paths.dataDir, opts.cwd),
@@ -13,6 +13,11 @@ import type { ConnectorWorkspaceEnvironment } from "../../../core/connector-envi
13
13
  import { resolveDirs } from "../../../app/constants";
14
14
  import { assertValidIndexName } from "../../../app/index-name";
15
15
  import { getCurrentGnoEntrypoint } from "../../../core/runtime-entrypoint";
16
+ import {
17
+ DEFAULT_MCP_TOOL_PROFILE,
18
+ type McpToolProfile,
19
+ isMcpToolProfile,
20
+ } from "../../../mcp/tool-profile.js";
16
21
  import { getTargetDisplayName } from "./target-display.js";
17
22
 
18
23
  export { getTargetDisplayName } from "./target-display.js";
@@ -70,6 +75,8 @@ export interface McpServerEntry {
70
75
 
71
76
  interface McpServerEntryOptions {
72
77
  enableWrite?: boolean;
78
+ /** Advertised MCP tool set the registration starts with; omitted = `full`. */
79
+ toolProfile?: McpToolProfile;
73
80
  indexName?: string;
74
81
  configPath?: string;
75
82
  dataDir?: string;
@@ -485,7 +492,25 @@ function appendMcpArguments(
485
492
  args.push("--config", resolve(options.configPath));
486
493
  }
487
494
  args.push("mcp");
495
+ if (options.toolProfile !== undefined) {
496
+ args.push("--tool-profile", options.toolProfile);
497
+ }
488
498
  if (options.enableWrite) {
489
499
  args.push("--enable-write");
490
500
  }
491
501
  }
502
+
503
+ /**
504
+ * The tool profile a registration starts with, read back from its args.
505
+ * A registration written before the flag existed carries none and runs `full`.
506
+ */
507
+ export function readMcpToolProfileFromArgs(
508
+ args: ReadonlyArray<string>
509
+ ): McpToolProfile {
510
+ const index = args.indexOf("--tool-profile");
511
+ if (index === -1) {
512
+ return DEFAULT_MCP_TOOL_PROFILE;
513
+ }
514
+ const value = args[index + 1];
515
+ return isMcpToolProfile(value) ? value : DEFAULT_MCP_TOOL_PROFILE;
516
+ }
@@ -6,6 +6,7 @@
6
6
 
7
7
  import type { ConnectorWorkspaceEnvironment } from "../../../core/connector-environment";
8
8
  import type { McpConnectorVerificationTarget } from "../../../core/connector-verifier";
9
+ import type { McpToolProfile } from "../../../mcp/tool-profile.js";
9
10
  import type { StandardMcpEntry } from "./config.js";
10
11
 
11
12
  import { normalizeConnectorWorkspaceEnvironment } from "../../../core/connector-environment";
@@ -29,6 +30,7 @@ import {
29
30
  type McpScope,
30
31
  type McpTarget,
31
32
  resolveMcpConfigPath,
33
+ readMcpToolProfileFromArgs,
32
34
  } from "./paths.js";
33
35
 
34
36
  // ─────────────────────────────────────────────────────────────────────────────
@@ -56,6 +58,8 @@ export interface McpTargetStatus {
56
58
  args: string[];
57
59
  env?: ConnectorWorkspaceEnvironment;
58
60
  };
61
+ /** Tool profile the registration starts with; `full` when its args carry none. */
62
+ toolProfile?: McpToolProfile;
59
63
  error?: string;
60
64
  }
61
65
 
@@ -234,6 +238,7 @@ export async function checkMcpTargetStatus(
234
238
  configPath,
235
239
  configured: true,
236
240
  serverEntry,
241
+ toolProfile: readMcpToolProfileFromArgs(serverEntry.args),
237
242
  };
238
243
  configIdentityByStatus.set(status, configIdentity);
239
244
  return status;
@@ -341,6 +346,7 @@ export async function statusMcp(opts: StatusOptions = {}): Promise<void> {
341
346
  if (status.configured && status.serverEntry) {
342
347
  process.stdout.write(` Command: ${status.serverEntry.command}\n`);
343
348
  process.stdout.write(` Args: ${status.serverEntry.args.join(" ")}\n`);
349
+ process.stdout.write(` Profile: ${status.toolProfile ?? "full"}\n`);
344
350
  }
345
351
 
346
352
  if (status.error) {
@@ -2234,9 +2234,14 @@ function wireMcpCommand(program: Command): void {
2234
2234
  "--enable-write",
2235
2235
  "Enable write operations in installed MCP configuration"
2236
2236
  )
2237
+ .option(
2238
+ "--tool-profile <profile>",
2239
+ "advertised tool set the registration starts with: core (7 read tools + capture/remember with --enable-write) or full (default)"
2240
+ )
2237
2241
  .option("--json", "JSON output")
2238
2242
  .action(async (cmdOpts: Record<string, unknown>) => {
2239
2243
  const target = cmdOpts.target as string;
2244
+ const toolProfile = parseToolProfileOption(cmdOpts.toolProfile);
2240
2245
  const requestedScope = cmdOpts.scope;
2241
2246
 
2242
2247
  // Import MCP_TARGETS for validation
@@ -2278,6 +2283,7 @@ function wireMcpCommand(program: Command): void {
2278
2283
  force: Boolean(cmdOpts.force),
2279
2284
  dryRun: Boolean(cmdOpts.dryRun),
2280
2285
  enableWrite: Boolean(cmdOpts.enableWrite),
2286
+ toolProfile,
2281
2287
  indexName: globals.index,
2282
2288
  configPath: globals.config,
2283
2289
  // Pass undefined if not set, so global --json can take effect
@@ -1 +0,0 @@
1
- ea5867ff2927a15524f4d5167c7ee9ee8a530b3604fefad886ec0327af7185d8 gno-browser-clipper-v1.45.0.zip