agent-nuvira 3.4.0 → 3.5.1
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/README.md +13 -13
- package/dist/agent-sdk/src/register.d.ts +23 -7
- package/dist/agent-sdk/src/register.d.ts.map +1 -1
- package/dist/agent-sdk/src/register.js +159 -5
- package/dist/agent-sdk/src/register.js.map +1 -1
- package/dist/agent-sdk/src/scaffold.d.ts +1 -1
- package/dist/agent-sdk/src/scaffold.js +1 -1
- package/dist/cli/agent.d.ts.map +1 -1
- package/dist/cli/agent.js +16 -3
- package/dist/cli/agent.js.map +1 -1
- package/dist/cli/chat.d.ts +202 -6
- package/dist/cli/chat.d.ts.map +1 -1
- package/dist/cli/chat.js +805 -34
- package/dist/cli/chat.js.map +1 -1
- package/dist/cli/config.d.ts +10 -0
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +39 -0
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +18 -3
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/duties.d.ts +11 -0
- package/dist/cli/duties.d.ts.map +1 -1
- package/dist/cli/duties.js +31 -0
- package/dist/cli/duties.js.map +1 -1
- package/dist/cli/mcp.d.ts +50 -0
- package/dist/cli/mcp.d.ts.map +1 -1
- package/dist/cli/mcp.js +496 -49
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cli/memory.d.ts.map +1 -1
- package/dist/cli/memory.js +3 -2
- package/dist/cli/memory.js.map +1 -1
- package/dist/cli/models.d.ts.map +1 -1
- package/dist/cli/models.js +55 -0
- package/dist/cli/models.js.map +1 -1
- package/dist/cli/plugins.d.ts.map +1 -1
- package/dist/cli/plugins.js +26 -9
- package/dist/cli/plugins.js.map +1 -1
- package/dist/cli/sdk.d.ts.map +1 -1
- package/dist/cli/sdk.js +10 -3
- package/dist/cli/sdk.js.map +1 -1
- package/dist/cli/tool-install-prompt.d.ts.map +1 -1
- package/dist/cli/tool-install-prompt.js +23 -1
- package/dist/cli/tool-install-prompt.js.map +1 -1
- package/dist/cli/tools.d.ts +16 -0
- package/dist/cli/tools.d.ts.map +1 -1
- package/dist/cli/tools.js +101 -1
- package/dist/cli/tools.js.map +1 -1
- package/dist/config/manager.d.ts +6 -0
- package/dist/config/manager.d.ts.map +1 -1
- package/dist/config/manager.js +66 -0
- package/dist/config/manager.js.map +1 -1
- package/dist/config/types.d.ts +18 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/learning/auto-router.d.ts +28 -0
- package/dist/learning/auto-router.d.ts.map +1 -1
- package/dist/learning/auto-router.js +84 -5
- package/dist/learning/auto-router.js.map +1 -1
- package/dist/learning/duty-lease.d.ts +163 -0
- package/dist/learning/duty-lease.d.ts.map +1 -0
- package/dist/learning/duty-lease.js +301 -0
- package/dist/learning/duty-lease.js.map +1 -0
- package/dist/learning/exhaustion-report.d.ts +12 -0
- package/dist/learning/exhaustion-report.d.ts.map +1 -1
- package/dist/learning/exhaustion-report.js +3 -1
- package/dist/learning/exhaustion-report.js.map +1 -1
- package/dist/learning/model-capability.d.ts +33 -0
- package/dist/learning/model-capability.d.ts.map +1 -1
- package/dist/learning/model-capability.js +51 -0
- package/dist/learning/model-capability.js.map +1 -1
- package/dist/learning/model-first-router.d.ts +21 -22
- package/dist/learning/model-first-router.d.ts.map +1 -1
- package/dist/learning/model-first-router.js +61 -54
- package/dist/learning/model-first-router.js.map +1 -1
- package/dist/learning/model-selection.d.ts +27 -0
- package/dist/learning/model-selection.d.ts.map +1 -1
- package/dist/learning/model-selection.js +46 -0
- package/dist/learning/model-selection.js.map +1 -1
- package/dist/learning/model-warmup.d.ts +92 -0
- package/dist/learning/model-warmup.d.ts.map +1 -1
- package/dist/learning/model-warmup.js +137 -2
- package/dist/learning/model-warmup.js.map +1 -1
- package/dist/learning/reasoning-trace.d.ts +1 -1
- package/dist/learning/reasoning-trace.d.ts.map +1 -1
- package/dist/learning/reasoning-trace.js.map +1 -1
- package/dist/learning/resilient-call.d.ts +15 -1
- package/dist/learning/resilient-call.d.ts.map +1 -1
- package/dist/learning/resilient-call.js +38 -22
- package/dist/learning/resilient-call.js.map +1 -1
- package/dist/learning/retry-patience.d.ts +139 -0
- package/dist/learning/retry-patience.d.ts.map +1 -0
- package/dist/learning/retry-patience.js +169 -0
- package/dist/learning/retry-patience.js.map +1 -0
- package/dist/learning/working-state.d.ts +7 -0
- package/dist/learning/working-state.d.ts.map +1 -1
- package/dist/learning/working-state.js +23 -1
- package/dist/learning/working-state.js.map +1 -1
- package/dist/mcp/catalog.d.ts +206 -26
- package/dist/mcp/catalog.d.ts.map +1 -1
- package/dist/mcp/catalog.js +664 -52
- package/dist/mcp/catalog.js.map +1 -1
- package/dist/mcp/client.d.ts +6 -0
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +35 -5
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/custom-server.d.ts +120 -0
- package/dist/mcp/custom-server.d.ts.map +1 -0
- package/dist/mcp/custom-server.js +330 -0
- package/dist/mcp/custom-server.js.map +1 -0
- package/dist/mcp/manager.d.ts +9 -1
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +15 -2
- package/dist/mcp/manager.js.map +1 -1
- package/dist/mcp/mcp-oauth.d.ts +28 -0
- package/dist/mcp/mcp-oauth.d.ts.map +1 -1
- package/dist/mcp/mcp-oauth.js +63 -8
- package/dist/mcp/mcp-oauth.js.map +1 -1
- package/dist/mcp/oauth-authorize.d.ts +51 -0
- package/dist/mcp/oauth-authorize.d.ts.map +1 -0
- package/dist/mcp/oauth-authorize.js +133 -0
- package/dist/mcp/oauth-authorize.js.map +1 -0
- package/dist/mcp/oauth-connect.d.ts +53 -0
- package/dist/mcp/oauth-connect.d.ts.map +1 -0
- package/dist/mcp/oauth-connect.js +103 -0
- package/dist/mcp/oauth-connect.js.map +1 -0
- package/dist/mcp/pin-verifier.d.ts +44 -0
- package/dist/mcp/pin-verifier.d.ts.map +1 -0
- package/dist/mcp/pin-verifier.js +102 -0
- package/dist/mcp/pin-verifier.js.map +1 -0
- package/dist/mcp/prereqs.d.ts +145 -0
- package/dist/mcp/prereqs.d.ts.map +1 -0
- package/dist/mcp/prereqs.js +245 -0
- package/dist/mcp/prereqs.js.map +1 -0
- package/dist/mcp/runtime.d.ts +59 -0
- package/dist/mcp/runtime.d.ts.map +1 -0
- package/dist/mcp/runtime.js +77 -0
- package/dist/mcp/runtime.js.map +1 -0
- package/dist/mcp/server.d.ts +21 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +29 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/settings.d.ts +164 -0
- package/dist/mcp/settings.d.ts.map +1 -0
- package/dist/mcp/settings.js +358 -0
- package/dist/mcp/settings.js.map +1 -0
- package/dist/mcp/types.d.ts +62 -0
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/mcp/types.js.map +1 -1
- package/dist/memory/vector-store.d.ts +12 -0
- package/dist/memory/vector-store.d.ts.map +1 -1
- package/dist/memory/vector-store.js +23 -0
- package/dist/memory/vector-store.js.map +1 -1
- package/dist/plugins/agent-plugin.d.ts +35 -0
- package/dist/plugins/agent-plugin.d.ts.map +1 -1
- package/dist/plugins/agent-plugin.js +142 -24
- package/dist/plugins/agent-plugin.js.map +1 -1
- package/dist/sandbox/manager.d.ts +12 -0
- package/dist/sandbox/manager.d.ts.map +1 -1
- package/dist/sandbox/manager.js +43 -2
- package/dist/sandbox/manager.js.map +1 -1
- package/dist/tools/modality/browser.d.ts +39 -3
- package/dist/tools/modality/browser.d.ts.map +1 -1
- package/dist/tools/modality/browser.js +113 -16
- package/dist/tools/modality/browser.js.map +1 -1
- package/dist/tools/optional-deps.d.ts +48 -0
- package/dist/tools/optional-deps.d.ts.map +1 -0
- package/dist/tools/optional-deps.js +42 -0
- package/dist/tools/optional-deps.js.map +1 -0
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +68 -11
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/remediation-ladder.d.ts.map +1 -1
- package/dist/tools/remediation-ladder.js +9 -1
- package/dist/tools/remediation-ladder.js.map +1 -1
- package/dist/tools/tool-loop.d.ts +41 -3
- package/dist/tools/tool-loop.d.ts.map +1 -1
- package/dist/tools/tool-loop.js +317 -9
- package/dist/tools/tool-loop.js.map +1 -1
- package/dist/web-dashboard/chat-retry.d.ts +11 -1
- package/dist/web-dashboard/chat-retry.d.ts.map +1 -1
- package/dist/web-dashboard/chat-retry.js +18 -4
- package/dist/web-dashboard/chat-retry.js.map +1 -1
- package/dist/web-dashboard/server.d.ts.map +1 -1
- package/dist/web-dashboard/server.js +349 -2
- package/dist/web-dashboard/server.js.map +1 -1
- package/package.json +6 -2
- package/src/web-dashboard/public/assets/{index-DeD3L0kG.js → index-Bik91KJh.js} +115 -89
- package/src/web-dashboard/public/assets/index-Bik91KJh.js.map +1 -0
- package/src/web-dashboard/public/index.html +1 -1
- package/src/web-dashboard/public/assets/index-DeD3L0kG.js.map +0 -1
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAGjF,OAAO,EAAW,SAAS,EAAa,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAc,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,YAAY,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAC9D,CAAC;AAEzB,iDAAiD;AACjD,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;AAEpF;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,SAAS;IACT,SAAS;IACT,MAAM;IACN,aAAa;IACb,YAAY;IACZ,WAAW;CACH,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP settings — the `mcp.*` section of `buffconfig.json`, resolved.
|
|
3
|
+
*
|
|
4
|
+
* Assessment §8.6 found the config-only levers were: a file's presence, its own
|
|
5
|
+
* `enabled` flag, the `mcp` toolset toggle and `tools.loopExposure` — and that
|
|
6
|
+
* `enableMcp` existed only as a programmatic option with no config home. This
|
|
7
|
+
* module is that home, and it is deliberately SMALL: one section, all keys
|
|
8
|
+
* optional, every default reproducing today's behaviour so an existing install
|
|
9
|
+
* that never touches it is byte-identical.
|
|
10
|
+
*
|
|
11
|
+
* ```jsonc
|
|
12
|
+
* "mcp": {
|
|
13
|
+
* "enabled": true, // master switch
|
|
14
|
+
* "autoConnect": true, // connect at turn start (existence-gated)
|
|
15
|
+
* "connectTimeoutMs": 2000, // wall-clock budget; exceeding it proceeds without MCP
|
|
16
|
+
* "maxToolsPerServer": 15, // eager-schema cap per server
|
|
17
|
+
* "maxToolsTotal": 60, // eager-schema cap across all servers
|
|
18
|
+
* "subagent": { "inherit": "conservative" }, // 'conservative' | 'full'
|
|
19
|
+
* "servers": {
|
|
20
|
+
* "context7": { "runtime": { "command": "/opt/node20/bin/node", "args": ["/usr/local/bin/npx"] } },
|
|
21
|
+
* "filesystem": { "args": ["/Users/me/project"], "enabled": false }
|
|
22
|
+
* }
|
|
23
|
+
* }
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* WHY IT READS THE FILE DIRECTLY instead of going through `ConfigManager`:
|
|
27
|
+
* the MCP layer is used by tests, the parity harness and (from Phase 2) every
|
|
28
|
+
* chat surface, and it must not drag the config manager's vault/env bootstrap
|
|
29
|
+
* into a discovery call. The keys here are non-secret scalars, and the pure
|
|
30
|
+
* resolver (`resolveMcpSettings`) is exported so a caller that ALREADY holds the
|
|
31
|
+
* config object (the dashboard, the CLI) resolves the exact same values.
|
|
32
|
+
*/
|
|
33
|
+
import type { MCPServerConfig } from './types.js';
|
|
34
|
+
/**
|
|
35
|
+
* How much MCP a SUBAGENT inherits from its parent.
|
|
36
|
+
*
|
|
37
|
+
* - `conservative` (DEFAULT) — plan §7.7: the child inherits MCP only when the
|
|
38
|
+
* parent already had it AND the child's allowance covers it. A subagent never
|
|
39
|
+
* silently gains reach.
|
|
40
|
+
* - `full` — explicit opt-in for Claude-style power: the child receives the
|
|
41
|
+
* parent's whole discovered MCP set (still cap-bound, still governed by
|
|
42
|
+
* effectClass/hooks/grants — the override widens REACH, never APPROVAL).
|
|
43
|
+
*
|
|
44
|
+
* Default is deliberately the safe one; turning it on is a decision a user makes
|
|
45
|
+
* once, in config, and can undo the same way.
|
|
46
|
+
*/
|
|
47
|
+
export type MCPSubagentInheritance = 'conservative' | 'full';
|
|
48
|
+
/** Per-server overrides, merged over the server's own config file. */
|
|
49
|
+
export interface MCPServerOverride {
|
|
50
|
+
/** Disable a configured server without deleting its file. */
|
|
51
|
+
enabled?: boolean;
|
|
52
|
+
/** Pin which catalog variant this server is (reported by `mcp list`). */
|
|
53
|
+
variant?: string;
|
|
54
|
+
/**
|
|
55
|
+
* Replace the stdio COMMAND — the path to a binary that is installed but NOT
|
|
56
|
+
* on PATH (e.g. `~/.local/bin/github-mcp-server`). Without this, a locally
|
|
57
|
+
* installed server is invisible to the probe and un-installable through the
|
|
58
|
+
* catalog, which is a reach gap rather than a missing capability.
|
|
59
|
+
*/
|
|
60
|
+
command?: string;
|
|
61
|
+
/** Per-server runtime override (see `runtime.ts`). */
|
|
62
|
+
runtime?: {
|
|
63
|
+
command: string;
|
|
64
|
+
args?: string[];
|
|
65
|
+
};
|
|
66
|
+
/** Replace the stdio args (e.g. the allowed roots for `filesystem`). */
|
|
67
|
+
args?: string[];
|
|
68
|
+
/** Per-server eager-schema cap, overriding `maxToolsPerServer`. */
|
|
69
|
+
maxTools?: number;
|
|
70
|
+
}
|
|
71
|
+
export interface MCPConfigSection {
|
|
72
|
+
enabled?: boolean;
|
|
73
|
+
autoConnect?: boolean;
|
|
74
|
+
connectTimeoutMs?: number;
|
|
75
|
+
maxToolsPerServer?: number;
|
|
76
|
+
maxToolsTotal?: number;
|
|
77
|
+
subagent?: {
|
|
78
|
+
inherit?: MCPSubagentInheritance | string;
|
|
79
|
+
};
|
|
80
|
+
servers?: Record<string, MCPServerOverride>;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Merge a validated patch into the stored section.
|
|
84
|
+
*
|
|
85
|
+
* WHY THIS EXISTS rather than a plain spread: `runtime` is a nested object, so a
|
|
86
|
+
* patch that sets only `runtime.command` would otherwise DROP a previously
|
|
87
|
+
* configured `runtime.args` (and vice versa). It also has to preserve an
|
|
88
|
+
* explicit `undefined` as a CLEAR — a plain `{...old, ...new}` cannot tell
|
|
89
|
+
* "not mentioned" from "cleared".
|
|
90
|
+
*/
|
|
91
|
+
export declare function mergeMcpSetting(existing: MCPConfigSection | null | undefined, patch: MCPConfigSection): MCPConfigSection;
|
|
92
|
+
export interface ResolvedMCPSettings {
|
|
93
|
+
enabled: boolean;
|
|
94
|
+
autoConnect: boolean;
|
|
95
|
+
connectTimeoutMs: number;
|
|
96
|
+
maxToolsPerServer: number;
|
|
97
|
+
maxToolsTotal: number;
|
|
98
|
+
subagentInheritance: MCPSubagentInheritance;
|
|
99
|
+
servers: Record<string, MCPServerOverride>;
|
|
100
|
+
/** Config values that were ignored/coerced, so a caller can report them once. */
|
|
101
|
+
warnings: string[];
|
|
102
|
+
}
|
|
103
|
+
export declare const MCP_SETTING_DEFAULTS: {
|
|
104
|
+
readonly enabled: true;
|
|
105
|
+
readonly autoConnect: true;
|
|
106
|
+
readonly connectTimeoutMs: 2000;
|
|
107
|
+
readonly maxToolsPerServer: 15;
|
|
108
|
+
readonly maxToolsTotal: 60;
|
|
109
|
+
readonly subagentInheritance: MCPSubagentInheritance;
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* Resolve the raw `mcp` section into settings with defaults + bounds applied.
|
|
113
|
+
* Pure: no I/O, so the dashboard, the CLI and tests all agree on the values.
|
|
114
|
+
*/
|
|
115
|
+
export declare function resolveMcpSettings(raw?: MCPConfigSection | null): ResolvedMCPSettings;
|
|
116
|
+
/** Parse outcome for one `mcp.*` setting. */
|
|
117
|
+
export type McpSettingParse = {
|
|
118
|
+
ok: true;
|
|
119
|
+
mcp: MCPConfigSection;
|
|
120
|
+
} | {
|
|
121
|
+
ok: false;
|
|
122
|
+
error: string;
|
|
123
|
+
};
|
|
124
|
+
/** Human list of the keys the parser accepts (shared by every error message). */
|
|
125
|
+
export declare const MCP_SETTING_KEYS: readonly ["mcp.enabled", "mcp.autoConnect", "mcp.connectTimeoutMs", "mcp.maxToolsPerServer", "mcp.maxToolsTotal", "mcp.subagent.inherit", "mcp.servers.<name>.enabled", "mcp.servers.<name>.command", "mcp.servers.<name>.variant", "mcp.servers.<name>.maxTools", "mcp.servers.<name>.args", "mcp.servers.<name>.runtime.command", "mcp.servers.<name>.runtime.args"];
|
|
126
|
+
/**
|
|
127
|
+
* Validate ONE `mcp.*` setting from its dotted path and string value.
|
|
128
|
+
*
|
|
129
|
+
* SHARED BY DESIGN. `nuvira config set mcp.*` and the dashboard's MCP page both
|
|
130
|
+
* call this, so the same key cannot be accepted in one surface and rejected —
|
|
131
|
+
* or coerced differently — in the other, and both write the same
|
|
132
|
+
* `buffconfig.json` section. A setting that "saves" in the dashboard and is
|
|
133
|
+
* ignored by the CLI would be a silent lie on one of the two surfaces.
|
|
134
|
+
*
|
|
135
|
+
* Pure: no writes, no filesystem, no environment. Booleans accept
|
|
136
|
+
* true/false, 1/0, yes/no, on/off; numbers are integers; `args` split on commas;
|
|
137
|
+
* an empty value CLEARS a string/list.
|
|
138
|
+
*/
|
|
139
|
+
export declare function parseMcpSetting(key: string, value: string): McpSettingParse;
|
|
140
|
+
/**
|
|
141
|
+
* Read `mcp` from the resolved config dir (`buffconfig.json`). Never throws: an
|
|
142
|
+
* absent or malformed file yields the defaults, because MCP configuration must
|
|
143
|
+
* not be able to break a chat turn.
|
|
144
|
+
*/
|
|
145
|
+
export declare function loadMcpSettings(configDir?: string): ResolvedMCPSettings;
|
|
146
|
+
/**
|
|
147
|
+
* Merge the per-server overrides over the discovered configs.
|
|
148
|
+
*
|
|
149
|
+
* This is the "nothing requires code, just configuration" seam: `context7`
|
|
150
|
+
* needing an older Node is fixed with
|
|
151
|
+
* `mcp.servers.context7.runtime.command`, and disabling a server is a boolean in
|
|
152
|
+
* config — no edit to a server file, no CLI flag, no release.
|
|
153
|
+
*/
|
|
154
|
+
export declare function applyServerOverrides(configs: MCPServerConfig[], settings: Pick<ResolvedMCPSettings, 'servers' | 'enabled'>): MCPServerConfig[];
|
|
155
|
+
/**
|
|
156
|
+
* The eager-schema cap that applies to one server, per plan §6:
|
|
157
|
+
* `min(perServerOverride ?? maxToolsPerServer, maxToolsTotal − alreadyExposed)`.
|
|
158
|
+
*
|
|
159
|
+
* Caps limit EXPOSURE, not access: an over-cap tool stays callable through
|
|
160
|
+
* `tool_search` results. Consumed by the Phase 3 exposure work; defined here so
|
|
161
|
+
* the number has one home.
|
|
162
|
+
*/
|
|
163
|
+
export declare function effectiveToolCap(server: string, settings: Pick<ResolvedMCPSettings, 'servers' | 'maxToolsPerServer' | 'maxToolsTotal'>, alreadyExposed: number): number;
|
|
164
|
+
//# sourceMappingURL=settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/mcp/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP settings — the `mcp.*` section of `buffconfig.json`, resolved.
|
|
3
|
+
*
|
|
4
|
+
* Assessment §8.6 found the config-only levers were: a file's presence, its own
|
|
5
|
+
* `enabled` flag, the `mcp` toolset toggle and `tools.loopExposure` — and that
|
|
6
|
+
* `enableMcp` existed only as a programmatic option with no config home. This
|
|
7
|
+
* module is that home, and it is deliberately SMALL: one section, all keys
|
|
8
|
+
* optional, every default reproducing today's behaviour so an existing install
|
|
9
|
+
* that never touches it is byte-identical.
|
|
10
|
+
*
|
|
11
|
+
* ```jsonc
|
|
12
|
+
* "mcp": {
|
|
13
|
+
* "enabled": true, // master switch
|
|
14
|
+
* "autoConnect": true, // connect at turn start (existence-gated)
|
|
15
|
+
* "connectTimeoutMs": 2000, // wall-clock budget; exceeding it proceeds without MCP
|
|
16
|
+
* "maxToolsPerServer": 15, // eager-schema cap per server
|
|
17
|
+
* "maxToolsTotal": 60, // eager-schema cap across all servers
|
|
18
|
+
* "subagent": { "inherit": "conservative" }, // 'conservative' | 'full'
|
|
19
|
+
* "servers": {
|
|
20
|
+
* "context7": { "runtime": { "command": "/opt/node20/bin/node", "args": ["/usr/local/bin/npx"] } },
|
|
21
|
+
* "filesystem": { "args": ["/Users/me/project"], "enabled": false }
|
|
22
|
+
* }
|
|
23
|
+
* }
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* WHY IT READS THE FILE DIRECTLY instead of going through `ConfigManager`:
|
|
27
|
+
* the MCP layer is used by tests, the parity harness and (from Phase 2) every
|
|
28
|
+
* chat surface, and it must not drag the config manager's vault/env bootstrap
|
|
29
|
+
* into a discovery call. The keys here are non-secret scalars, and the pure
|
|
30
|
+
* resolver (`resolveMcpSettings`) is exported so a caller that ALREADY holds the
|
|
31
|
+
* config object (the dashboard, the CLI) resolves the exact same values.
|
|
32
|
+
*/
|
|
33
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
34
|
+
import { join } from 'node:path';
|
|
35
|
+
import { resolveNuviraConfigDir } from '../config/paths.js';
|
|
36
|
+
import { logger } from '../utils/logger.js';
|
|
37
|
+
/**
|
|
38
|
+
* Merge a validated patch into the stored section.
|
|
39
|
+
*
|
|
40
|
+
* WHY THIS EXISTS rather than a plain spread: `runtime` is a nested object, so a
|
|
41
|
+
* patch that sets only `runtime.command` would otherwise DROP a previously
|
|
42
|
+
* configured `runtime.args` (and vice versa). It also has to preserve an
|
|
43
|
+
* explicit `undefined` as a CLEAR — a plain `{...old, ...new}` cannot tell
|
|
44
|
+
* "not mentioned" from "cleared".
|
|
45
|
+
*/
|
|
46
|
+
export function mergeMcpSetting(existing, patch) {
|
|
47
|
+
const base = existing ?? {};
|
|
48
|
+
const servers = { ...(base.servers ?? {}) };
|
|
49
|
+
for (const [name, override] of Object.entries(patch.servers ?? {})) {
|
|
50
|
+
const previous = base.servers?.[name] ?? {};
|
|
51
|
+
const next = override;
|
|
52
|
+
const { runtime: patchedRuntime, ...rest } = next;
|
|
53
|
+
let runtime;
|
|
54
|
+
if (!('runtime' in next)) {
|
|
55
|
+
runtime = previous.runtime; // not mentioned — leave it alone
|
|
56
|
+
}
|
|
57
|
+
else if (!patchedRuntime) {
|
|
58
|
+
runtime = undefined; // explicit clear (`runtime.command` set to empty)
|
|
59
|
+
}
|
|
60
|
+
else if (!patchedRuntime.command && previous.runtime?.command) {
|
|
61
|
+
// `runtime.args` on its own must not erase the command it applies to: the
|
|
62
|
+
// parser emits an empty command because it cannot see the stored one.
|
|
63
|
+
runtime = {
|
|
64
|
+
command: previous.runtime.command,
|
|
65
|
+
...(patchedRuntime.args !== undefined ? { args: patchedRuntime.args } : {}),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// Setting the command must not drop args that were configured earlier
|
|
70
|
+
// (and vice versa) — `runtime` is one object, set in two commands.
|
|
71
|
+
runtime = {
|
|
72
|
+
...patchedRuntime,
|
|
73
|
+
...(patchedRuntime.args === undefined && previous.runtime?.args
|
|
74
|
+
? { args: previous.runtime.args }
|
|
75
|
+
: {}),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
const merged = { ...previous, ...rest };
|
|
79
|
+
if (runtime)
|
|
80
|
+
merged.runtime = runtime;
|
|
81
|
+
else
|
|
82
|
+
delete merged.runtime;
|
|
83
|
+
servers[name] = merged;
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
...base,
|
|
87
|
+
...patch,
|
|
88
|
+
...(base.subagent || patch.subagent
|
|
89
|
+
? { subagent: { ...(base.subagent ?? {}), ...(patch.subagent ?? {}) } }
|
|
90
|
+
: {}),
|
|
91
|
+
...(Object.keys(servers).length > 0 ? { servers } : {}),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
export const MCP_SETTING_DEFAULTS = {
|
|
95
|
+
enabled: true,
|
|
96
|
+
autoConnect: true,
|
|
97
|
+
connectTimeoutMs: 2000,
|
|
98
|
+
maxToolsPerServer: 15,
|
|
99
|
+
maxToolsTotal: 60,
|
|
100
|
+
subagentInheritance: 'conservative',
|
|
101
|
+
};
|
|
102
|
+
/** Clamp bounds — a typo must not disable the budget or hang a turn for a minute. */
|
|
103
|
+
const CONNECT_TIMEOUT_MIN_MS = 250;
|
|
104
|
+
const CONNECT_TIMEOUT_MAX_MS = 15_000;
|
|
105
|
+
const MAX_TOOLS_PER_SERVER_CEILING = 200;
|
|
106
|
+
const MAX_TOOLS_TOTAL_CEILING = 1000;
|
|
107
|
+
function positiveInt(value, fallback, min, max, key, warnings) {
|
|
108
|
+
if (value === undefined || value === null)
|
|
109
|
+
return fallback;
|
|
110
|
+
const n = typeof value === 'string' ? Number(value.trim()) : Number(value);
|
|
111
|
+
if (!Number.isFinite(n) || !Number.isInteger(n) || n <= 0) {
|
|
112
|
+
warnings.push(`mcp.${key} must be a positive integer — using ${fallback}`);
|
|
113
|
+
return fallback;
|
|
114
|
+
}
|
|
115
|
+
if (n < min || n > max) {
|
|
116
|
+
const clamped = Math.min(Math.max(n, min), max);
|
|
117
|
+
warnings.push(`mcp.${key} ${n} is outside ${min}–${max} — using ${clamped}`);
|
|
118
|
+
return clamped;
|
|
119
|
+
}
|
|
120
|
+
return n;
|
|
121
|
+
}
|
|
122
|
+
function booleanSetting(value, fallback, key, warnings) {
|
|
123
|
+
if (value === undefined || value === null)
|
|
124
|
+
return fallback;
|
|
125
|
+
if (typeof value === 'boolean')
|
|
126
|
+
return value;
|
|
127
|
+
if (typeof value === 'string') {
|
|
128
|
+
const lower = value.trim().toLowerCase();
|
|
129
|
+
if (['true', '1', 'yes', 'on'].includes(lower))
|
|
130
|
+
return true;
|
|
131
|
+
if (['false', '0', 'no', 'off'].includes(lower))
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
warnings.push(`mcp.${key} must be true or false — using ${fallback}`);
|
|
135
|
+
return fallback;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Resolve the raw `mcp` section into settings with defaults + bounds applied.
|
|
139
|
+
* Pure: no I/O, so the dashboard, the CLI and tests all agree on the values.
|
|
140
|
+
*/
|
|
141
|
+
export function resolveMcpSettings(raw) {
|
|
142
|
+
const warnings = [];
|
|
143
|
+
const section = raw ?? {};
|
|
144
|
+
const inheritRaw = section.subagent?.inherit;
|
|
145
|
+
let subagentInheritance = MCP_SETTING_DEFAULTS.subagentInheritance;
|
|
146
|
+
if (inheritRaw !== undefined) {
|
|
147
|
+
if (inheritRaw === 'conservative' || inheritRaw === 'full') {
|
|
148
|
+
subagentInheritance = inheritRaw;
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
warnings.push(`mcp.subagent.inherit must be 'conservative' or 'full' (got '${String(inheritRaw)}') — using 'conservative'`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
enabled: booleanSetting(section.enabled, MCP_SETTING_DEFAULTS.enabled, 'enabled', warnings),
|
|
156
|
+
autoConnect: booleanSetting(section.autoConnect, MCP_SETTING_DEFAULTS.autoConnect, 'autoConnect', warnings),
|
|
157
|
+
connectTimeoutMs: positiveInt(section.connectTimeoutMs, MCP_SETTING_DEFAULTS.connectTimeoutMs, CONNECT_TIMEOUT_MIN_MS, CONNECT_TIMEOUT_MAX_MS, 'connectTimeoutMs', warnings),
|
|
158
|
+
maxToolsPerServer: positiveInt(section.maxToolsPerServer, MCP_SETTING_DEFAULTS.maxToolsPerServer, 1, MAX_TOOLS_PER_SERVER_CEILING, 'maxToolsPerServer', warnings),
|
|
159
|
+
maxToolsTotal: positiveInt(section.maxToolsTotal, MCP_SETTING_DEFAULTS.maxToolsTotal, 1, MAX_TOOLS_TOTAL_CEILING, 'maxToolsTotal', warnings),
|
|
160
|
+
subagentInheritance,
|
|
161
|
+
servers: { ...(section.servers ?? {}) },
|
|
162
|
+
warnings,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/** Human list of the keys the parser accepts (shared by every error message). */
|
|
166
|
+
export const MCP_SETTING_KEYS = [
|
|
167
|
+
'mcp.enabled',
|
|
168
|
+
'mcp.autoConnect',
|
|
169
|
+
'mcp.connectTimeoutMs',
|
|
170
|
+
'mcp.maxToolsPerServer',
|
|
171
|
+
'mcp.maxToolsTotal',
|
|
172
|
+
'mcp.subagent.inherit',
|
|
173
|
+
'mcp.servers.<name>.enabled',
|
|
174
|
+
'mcp.servers.<name>.command',
|
|
175
|
+
'mcp.servers.<name>.variant',
|
|
176
|
+
'mcp.servers.<name>.maxTools',
|
|
177
|
+
'mcp.servers.<name>.args',
|
|
178
|
+
'mcp.servers.<name>.runtime.command',
|
|
179
|
+
'mcp.servers.<name>.runtime.args',
|
|
180
|
+
];
|
|
181
|
+
/**
|
|
182
|
+
* Validate ONE `mcp.*` setting from its dotted path and string value.
|
|
183
|
+
*
|
|
184
|
+
* SHARED BY DESIGN. `nuvira config set mcp.*` and the dashboard's MCP page both
|
|
185
|
+
* call this, so the same key cannot be accepted in one surface and rejected —
|
|
186
|
+
* or coerced differently — in the other, and both write the same
|
|
187
|
+
* `buffconfig.json` section. A setting that "saves" in the dashboard and is
|
|
188
|
+
* ignored by the CLI would be a silent lie on one of the two surfaces.
|
|
189
|
+
*
|
|
190
|
+
* Pure: no writes, no filesystem, no environment. Booleans accept
|
|
191
|
+
* true/false, 1/0, yes/no, on/off; numbers are integers; `args` split on commas;
|
|
192
|
+
* an empty value CLEARS a string/list.
|
|
193
|
+
*/
|
|
194
|
+
export function parseMcpSetting(key, value) {
|
|
195
|
+
const parts = String(key).trim().split('.');
|
|
196
|
+
const raw = String(value ?? '');
|
|
197
|
+
const trimmed = raw.trim();
|
|
198
|
+
const bool = () => {
|
|
199
|
+
const lower = trimmed.toLowerCase();
|
|
200
|
+
if (['true', '1', 'yes', 'on'].includes(lower))
|
|
201
|
+
return true;
|
|
202
|
+
if (['false', '0', 'no', 'off'].includes(lower))
|
|
203
|
+
return false;
|
|
204
|
+
return null;
|
|
205
|
+
};
|
|
206
|
+
const int = (min, max, label) => {
|
|
207
|
+
const n = Number(trimmed);
|
|
208
|
+
if (!Number.isInteger(n) || n < min || n > max) {
|
|
209
|
+
return { error: `${key} must be an integer between ${min} and ${max} (got '${raw}')` };
|
|
210
|
+
}
|
|
211
|
+
return n;
|
|
212
|
+
};
|
|
213
|
+
const list = () => {
|
|
214
|
+
const items = raw.split(',').map((v) => v.trim()).filter(Boolean);
|
|
215
|
+
return items.length > 0 ? items : undefined;
|
|
216
|
+
};
|
|
217
|
+
if (parts[0] !== 'mcp') {
|
|
218
|
+
return { ok: false, error: `Not an MCP setting: ${key}. Expected one of: ${MCP_SETTING_KEYS.join(', ')}` };
|
|
219
|
+
}
|
|
220
|
+
if (parts.length === 2) {
|
|
221
|
+
const field = parts[1];
|
|
222
|
+
if (field === 'enabled' || field === 'autoConnect') {
|
|
223
|
+
const typed = bool();
|
|
224
|
+
if (typed === null)
|
|
225
|
+
return { ok: false, error: `${key} must be true or false (got '${raw}')` };
|
|
226
|
+
return { ok: true, mcp: { [field]: typed } };
|
|
227
|
+
}
|
|
228
|
+
if (field === 'connectTimeoutMs' || field === 'maxToolsPerServer' || field === 'maxToolsTotal') {
|
|
229
|
+
const parsed = int(1, field === 'connectTimeoutMs' ? 60_000 : 10_000, field);
|
|
230
|
+
if (typeof parsed !== 'number')
|
|
231
|
+
return { ok: false, error: parsed.error };
|
|
232
|
+
return { ok: true, mcp: { [field]: parsed } };
|
|
233
|
+
}
|
|
234
|
+
return {
|
|
235
|
+
ok: false,
|
|
236
|
+
error: `Unknown MCP setting '${field}'. Expected one of: ${MCP_SETTING_KEYS.slice(0, 6).join(', ')}`,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
if (parts.length === 3 && parts[1] === 'subagent' && parts[2] === 'inherit') {
|
|
240
|
+
const mode = trimmed.toLowerCase();
|
|
241
|
+
if (mode !== 'conservative' && mode !== 'full') {
|
|
242
|
+
return {
|
|
243
|
+
ok: false,
|
|
244
|
+
error: `mcp.subagent.inherit must be 'conservative' (default) or 'full' (got '${raw}')`,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
return { ok: true, mcp: { subagent: { inherit: mode } } };
|
|
248
|
+
}
|
|
249
|
+
if (parts.length >= 4 && parts[1] === 'servers') {
|
|
250
|
+
const server = parts[2];
|
|
251
|
+
if (!server)
|
|
252
|
+
return { ok: false, error: `mcp.servers needs a server name, e.g. ${MCP_SETTING_KEYS[6]}` };
|
|
253
|
+
const field = parts[3];
|
|
254
|
+
const rest = parts.slice(4).join('.');
|
|
255
|
+
if (parts.length === 4 && field === 'enabled') {
|
|
256
|
+
const typed = bool();
|
|
257
|
+
if (typed === null)
|
|
258
|
+
return { ok: false, error: `${key} must be true or false (got '${raw}')` };
|
|
259
|
+
return { ok: true, mcp: { servers: { [server]: { enabled: typed } } } };
|
|
260
|
+
}
|
|
261
|
+
if (parts.length === 4 && field === 'variant') {
|
|
262
|
+
return { ok: true, mcp: { servers: { [server]: { variant: trimmed || undefined } } } };
|
|
263
|
+
}
|
|
264
|
+
if (parts.length === 4 && field === 'command') {
|
|
265
|
+
// The path to a binary that is installed but not on PATH.
|
|
266
|
+
return { ok: true, mcp: { servers: { [server]: { command: trimmed || undefined } } } };
|
|
267
|
+
}
|
|
268
|
+
if (parts.length === 4 && field === 'maxTools') {
|
|
269
|
+
const parsed = int(1, 10_000, field);
|
|
270
|
+
if (typeof parsed !== 'number')
|
|
271
|
+
return { ok: false, error: parsed.error };
|
|
272
|
+
return { ok: true, mcp: { servers: { [server]: { maxTools: parsed } } } };
|
|
273
|
+
}
|
|
274
|
+
if (parts.length === 4 && field === 'args') {
|
|
275
|
+
return { ok: true, mcp: { servers: { [server]: { args: list() } } } };
|
|
276
|
+
}
|
|
277
|
+
if (parts.length === 5 && field === 'runtime' && rest === 'command') {
|
|
278
|
+
// An empty command CLEARS the whole runtime override (a half-configured
|
|
279
|
+
// override that prefixes nothing is worse than none).
|
|
280
|
+
return {
|
|
281
|
+
ok: true,
|
|
282
|
+
mcp: { servers: { [server]: { runtime: trimmed ? { command: trimmed } : undefined } } },
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
if (parts.length === 5 && field === 'runtime' && rest === 'args') {
|
|
286
|
+
return { ok: true, mcp: { servers: { [server]: { runtime: { command: '', args: list() } } } } };
|
|
287
|
+
}
|
|
288
|
+
return {
|
|
289
|
+
ok: false,
|
|
290
|
+
error: `Unknown mcp.servers setting '${parts.slice(3).join('.')}'. Expected: enabled, command, variant, maxTools, args, runtime.command, runtime.args`,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
return { ok: false, error: `Unknown MCP setting '${key}'. Expected one of: ${MCP_SETTING_KEYS.join(', ')}` };
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Read `mcp` from the resolved config dir (`buffconfig.json`). Never throws: an
|
|
297
|
+
* absent or malformed file yields the defaults, because MCP configuration must
|
|
298
|
+
* not be able to break a chat turn.
|
|
299
|
+
*/
|
|
300
|
+
export function loadMcpSettings(configDir) {
|
|
301
|
+
const dir = configDir ?? resolveNuviraConfigDir();
|
|
302
|
+
const file = join(dir, 'buffconfig.json');
|
|
303
|
+
try {
|
|
304
|
+
if (!existsSync(file))
|
|
305
|
+
return resolveMcpSettings(null);
|
|
306
|
+
const parsed = JSON.parse(readFileSync(file, 'utf-8'));
|
|
307
|
+
return resolveMcpSettings(parsed.mcp ?? null);
|
|
308
|
+
}
|
|
309
|
+
catch (err) {
|
|
310
|
+
logger.debug(`MCP: could not read settings from ${file}: ${err}`);
|
|
311
|
+
return resolveMcpSettings(null);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Merge the per-server overrides over the discovered configs.
|
|
316
|
+
*
|
|
317
|
+
* This is the "nothing requires code, just configuration" seam: `context7`
|
|
318
|
+
* needing an older Node is fixed with
|
|
319
|
+
* `mcp.servers.context7.runtime.command`, and disabling a server is a boolean in
|
|
320
|
+
* config — no edit to a server file, no CLI flag, no release.
|
|
321
|
+
*/
|
|
322
|
+
export function applyServerOverrides(configs, settings) {
|
|
323
|
+
if (!settings.enabled)
|
|
324
|
+
return [];
|
|
325
|
+
const out = [];
|
|
326
|
+
for (const config of configs) {
|
|
327
|
+
const override = settings.servers[config.name];
|
|
328
|
+
if (!override) {
|
|
329
|
+
out.push(config);
|
|
330
|
+
continue;
|
|
331
|
+
}
|
|
332
|
+
if (override.enabled === false)
|
|
333
|
+
continue;
|
|
334
|
+
out.push({
|
|
335
|
+
...config,
|
|
336
|
+
...(override.enabled !== undefined ? { enabled: override.enabled } : {}),
|
|
337
|
+
...(override.variant !== undefined ? { variant: override.variant } : {}),
|
|
338
|
+
...(override.command !== undefined ? { command: override.command } : {}),
|
|
339
|
+
...(override.runtime !== undefined ? { runtime: override.runtime } : {}),
|
|
340
|
+
...(override.args !== undefined ? { args: override.args } : {}),
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
return out;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* The eager-schema cap that applies to one server, per plan §6:
|
|
347
|
+
* `min(perServerOverride ?? maxToolsPerServer, maxToolsTotal − alreadyExposed)`.
|
|
348
|
+
*
|
|
349
|
+
* Caps limit EXPOSURE, not access: an over-cap tool stays callable through
|
|
350
|
+
* `tool_search` results. Consumed by the Phase 3 exposure work; defined here so
|
|
351
|
+
* the number has one home.
|
|
352
|
+
*/
|
|
353
|
+
export function effectiveToolCap(server, settings, alreadyExposed) {
|
|
354
|
+
const perServer = settings.servers[server]?.maxTools ?? settings.maxToolsPerServer;
|
|
355
|
+
const remainingTotal = Math.max(settings.maxToolsTotal - alreadyExposed, 0);
|
|
356
|
+
return Math.max(Math.min(perServer, remainingTotal), 0);
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/mcp/settings.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/types.d.ts
CHANGED
|
@@ -167,6 +167,41 @@ export interface GetPromptRequest {
|
|
|
167
167
|
name: string;
|
|
168
168
|
arguments?: Record<string, string>;
|
|
169
169
|
}
|
|
170
|
+
/**
|
|
171
|
+
* OAuth 2.0 for a remote MCP server whose credential is a TOKEN, not a static
|
|
172
|
+
* key — the flow Google Workspace, Slack and Figma's official remote servers
|
|
173
|
+
* require (none of them accept a long-lived API key).
|
|
174
|
+
*
|
|
175
|
+
* WHY IT LIVES IN THE SERVER CONFIG. The credential those servers want is a
|
|
176
|
+
* short-lived access token that must be refreshed, so "install the server" and
|
|
177
|
+
* "authorize the server" are two different moments: the config declares HOW to
|
|
178
|
+
* get a token, and the first connect obtains or refreshes one. Tokens themselves
|
|
179
|
+
* are NEVER written here — they live in the OAuth manager's own store
|
|
180
|
+
* (`~/.nuvira/mcp-oauth.json`), which is where refresh and expiry belong.
|
|
181
|
+
*/
|
|
182
|
+
export interface MCPOAuthServerConfig {
|
|
183
|
+
/** Token endpoint (required — the code exchange and every refresh go here). */
|
|
184
|
+
tokenEndpoint: string;
|
|
185
|
+
/** Authorization endpoint. Required for the interactive (authorization-code) flow. */
|
|
186
|
+
authorizationEndpoint?: string;
|
|
187
|
+
/**
|
|
188
|
+
* Client credentials. May reference an env var (`${VAR}`), which the catalog
|
|
189
|
+
* installer expands from the resolved environment at install time — so a
|
|
190
|
+
* secret can come from the environment and still land in a 0600 config file.
|
|
191
|
+
*/
|
|
192
|
+
clientId?: string;
|
|
193
|
+
clientSecret?: string;
|
|
194
|
+
/** Scopes to request. Also written into the store so a refresh asks for the same set. */
|
|
195
|
+
scopes?: string[];
|
|
196
|
+
/** Use PKCE (S256) — required by Google's installed-app clients. */
|
|
197
|
+
usePKCE?: boolean;
|
|
198
|
+
/**
|
|
199
|
+
* `client_credentials` for a server-to-server token (no user, no browser);
|
|
200
|
+
* default is `authorization_code`, where a user token is obtained once
|
|
201
|
+
* (`nuvira mcp authorize <name>`) and then refreshed forever.
|
|
202
|
+
*/
|
|
203
|
+
grant?: 'authorization_code' | 'client_credentials';
|
|
204
|
+
}
|
|
170
205
|
export interface MCPServerConfig {
|
|
171
206
|
/** A unique name for this MCP server connection */
|
|
172
207
|
name: string;
|
|
@@ -182,6 +217,33 @@ export interface MCPServerConfig {
|
|
|
182
217
|
headers?: Record<string, string>;
|
|
183
218
|
/** Environment variables for the stdio subprocess */
|
|
184
219
|
env?: Record<string, string>;
|
|
220
|
+
/**
|
|
221
|
+
* Per-server runtime override: run the stdio `command` through a DIFFERENT
|
|
222
|
+
* interpreter — `runtime.command runtime.args… <command> <args…>`.
|
|
223
|
+
*
|
|
224
|
+
* It exists so one server with a higher Node (or Python) floor cannot raise
|
|
225
|
+
* the product's own floor: `context7-mcp@4.3.0` declares
|
|
226
|
+
* `engines.node ≥ 20.18.1`, while Nuvira ships `≥ 18.18.0`, so that server is
|
|
227
|
+
* started under its own Node instead. Set at install time (`nuvira mcp
|
|
228
|
+
* install context7 --runtime /path/to/node20`) or by configuration
|
|
229
|
+
* (`mcp.servers.<name>.runtime.command`), never by forking the codebase.
|
|
230
|
+
*/
|
|
231
|
+
runtime?: {
|
|
232
|
+
command: string;
|
|
233
|
+
args?: string[];
|
|
234
|
+
};
|
|
235
|
+
/**
|
|
236
|
+
* Which catalog variant produced this config (e.g. 'remote', 'npx'), when it
|
|
237
|
+
* came from `nuvira mcp install`. Reported by `nuvira mcp list` / `info`;
|
|
238
|
+
* never required to connect.
|
|
239
|
+
*/
|
|
240
|
+
variant?: string;
|
|
241
|
+
/**
|
|
242
|
+
* OAuth 2.0 for a remote server. When present, the connect path resolves a
|
|
243
|
+
* valid access token (reusing or refreshing a stored one) and sends it as
|
|
244
|
+
* `Authorization: Bearer …`; an explicit `headers.Authorization` wins.
|
|
245
|
+
*/
|
|
246
|
+
oauth?: MCPOAuthServerConfig;
|
|
185
247
|
/** Whether this server is enabled */
|
|
186
248
|
enabled: boolean;
|
|
187
249
|
}
|