@evalops/maestro 0.10.22 → 0.10.24
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 +4 -4
- package/dist/agent/agent.d.ts +2 -2
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +1 -1
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/keys.d.ts +2 -5
- package/dist/agent/keys.d.ts.map +1 -1
- package/dist/agent/keys.js +4 -5
- package/dist/agent/keys.js.map +1 -1
- package/dist/agent/modes.d.ts +2 -2
- package/dist/agent/modes.d.ts.map +1 -1
- package/dist/agent/modes.js +6 -7
- package/dist/agent/modes.js.map +1 -1
- package/dist/agent/providers/anthropic.d.ts.map +1 -1
- package/dist/agent/providers/anthropic.js +4 -4
- package/dist/agent/providers/anthropic.js.map +1 -1
- package/dist/agent/providers/google.js +1 -1
- package/dist/agent/swarm/executor.d.ts +2 -0
- package/dist/agent/swarm/executor.d.ts.map +1 -1
- package/dist/agent/swarm/executor.js +208 -35
- package/dist/agent/swarm/executor.js.map +1 -1
- package/dist/agent/swarm/types.d.ts +2 -0
- package/dist/agent/swarm/types.d.ts.map +1 -1
- package/dist/agent/swarm/types.js.map +1 -1
- package/dist/agent/tool-capability-types.d.ts +36 -0
- package/dist/agent/tool-capability-types.d.ts.map +1 -0
- package/dist/agent/tool-capability-types.js +2 -0
- package/dist/agent/tool-capability-types.js.map +1 -0
- package/dist/agent/transport/tool-execution-bridge.d.ts +13 -0
- package/dist/agent/transport/tool-execution-bridge.d.ts.map +1 -1
- package/dist/agent/transport/tool-execution-bridge.js +28 -15
- package/dist/agent/transport/tool-execution-bridge.js.map +1 -1
- package/dist/agent/transport/transport-utils.d.ts.map +1 -1
- package/dist/agent/transport/transport-utils.js +2 -3
- package/dist/agent/transport/transport-utils.js.map +1 -1
- package/dist/agent/transport.js +1 -1
- package/dist/agent/transport.js.map +1 -1
- package/dist/agent/type-guards.d.ts +1 -1
- package/dist/agent/type-guards.js +1 -1
- package/dist/agent/type-guards.js.map +1 -1
- package/dist/agent/types.d.ts +5 -3
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +2 -2
- package/dist/agent/types.js.map +1 -1
- package/dist/app-server/daemon-lifecycle-api.d.ts +31 -0
- package/dist/app-server/daemon-lifecycle-api.d.ts.map +1 -0
- package/dist/app-server/daemon-lifecycle-api.js +259 -0
- package/dist/app-server/daemon-lifecycle-api.js.map +1 -0
- package/dist/app-server/external-agent-import-api.d.ts +30 -0
- package/dist/app-server/external-agent-import-api.d.ts.map +1 -0
- package/dist/app-server/external-agent-import-api.js +553 -0
- package/dist/app-server/external-agent-import-api.js.map +1 -0
- package/dist/app-server/host-control-api.d.ts +30 -0
- package/dist/app-server/host-control-api.d.ts.map +1 -0
- package/dist/app-server/host-control-api.js +343 -0
- package/dist/app-server/host-control-api.js.map +1 -0
- package/dist/app-server/in-process-client.d.ts +2 -2
- package/dist/app-server/in-process-client.d.ts.map +1 -1
- package/dist/app-server/in-process-client.js.map +1 -1
- package/dist/app-server/network-governance-api.d.ts +26 -0
- package/dist/app-server/network-governance-api.d.ts.map +1 -0
- package/dist/app-server/network-governance-api.js +476 -0
- package/dist/app-server/network-governance-api.js.map +1 -0
- package/dist/app-server/plugin-bundle-api.d.ts +17 -0
- package/dist/app-server/plugin-bundle-api.d.ts.map +1 -0
- package/dist/app-server/plugin-bundle-api.js +219 -0
- package/dist/app-server/plugin-bundle-api.js.map +1 -0
- package/dist/app-server/policy-control-api.d.ts +14 -0
- package/dist/app-server/policy-control-api.d.ts.map +1 -0
- package/dist/app-server/policy-control-api.js +200 -0
- package/dist/app-server/policy-control-api.js.map +1 -0
- package/dist/app-server/protocol-modes-api.d.ts +22 -0
- package/dist/app-server/protocol-modes-api.d.ts.map +1 -0
- package/dist/app-server/protocol-modes-api.js +124 -0
- package/dist/app-server/protocol-modes-api.js.map +1 -0
- package/dist/app-server/sandbox-proof-api.d.ts +21 -0
- package/dist/app-server/sandbox-proof-api.d.ts.map +1 -0
- package/dist/app-server/sandbox-proof-api.js +127 -0
- package/dist/app-server/sandbox-proof-api.js.map +1 -0
- package/dist/app-server/session-api.d.ts +93 -3
- package/dist/app-server/session-api.d.ts.map +1 -1
- package/dist/app-server/session-api.js +706 -18
- package/dist/app-server/session-api.js.map +1 -1
- package/dist/audit/logger.d.ts +1 -1
- package/dist/bootstrap/auth-setup.d.ts.map +1 -1
- package/dist/bootstrap/auth-setup.js +17 -2
- package/dist/bootstrap/auth-setup.js.map +1 -1
- package/dist/bootstrap/model-resolution-setup.d.ts.map +1 -1
- package/dist/bootstrap/model-resolution-setup.js +19 -4
- package/dist/bootstrap/model-resolution-setup.js.map +1 -1
- package/dist/cli/args.d.ts +2 -2
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +2 -2
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/commands/a2a.d.ts.map +1 -1
- package/dist/cli/commands/a2a.js +226 -14
- package/dist/cli/commands/a2a.js.map +1 -1
- package/dist/cli/commands/anthropic.d.ts +1 -1
- package/dist/cli/commands/anthropic.d.ts.map +1 -1
- package/dist/cli/commands/anthropic.js +3 -68
- package/dist/cli/commands/anthropic.js.map +1 -1
- package/dist/cli/commands/modes.js +1 -1
- package/dist/cli/commands/modes.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +5 -7
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/rpc-mode.d.ts +1 -1
- package/dist/cli/rpc-mode.js +1 -1
- package/dist/cli/rpc-mode.js.map +1 -1
- package/dist/cli/session.js +1 -1
- package/dist/cli/session.js.map +1 -1
- package/dist/cli-tui/commands/command-catalog.d.ts.map +1 -1
- package/dist/cli-tui/commands/command-catalog.js +7 -12
- package/dist/cli-tui/commands/command-catalog.js.map +1 -1
- package/dist/cli-tui/commands/subcommands/auth-commands.d.ts +1 -1
- package/dist/cli-tui/commands/subcommands/auth-commands.d.ts.map +1 -1
- package/dist/cli-tui/commands/subcommands/auth-commands.js +4 -12
- package/dist/cli-tui/commands/subcommands/auth-commands.js.map +1 -1
- package/dist/cli-tui/custom-editor.d.ts +1 -1
- package/dist/cli-tui/custom-editor.js +2 -2
- package/dist/cli-tui/custom-editor.js.map +1 -1
- package/dist/cli-tui/oauth/oauth-flow-controller.d.ts.map +1 -1
- package/dist/cli-tui/oauth/oauth-flow-controller.js +19 -23
- package/dist/cli-tui/oauth/oauth-flow-controller.js.map +1 -1
- package/dist/cli-tui/selectors/model-selector.d.ts.map +1 -1
- package/dist/cli-tui/selectors/model-selector.js +0 -1
- package/dist/cli-tui/selectors/model-selector.js.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector-view.d.ts +2 -2
- package/dist/cli-tui/selectors/oauth-selector-view.d.ts.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector-view.js.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector.d.ts +2 -2
- package/dist/cli-tui/selectors/oauth-selector.d.ts.map +1 -1
- package/dist/cli-tui/selectors/oauth-selector.js +3 -4
- package/dist/cli-tui/selectors/oauth-selector.js.map +1 -1
- package/dist/cli-tui/tui-renderer/mcp-events-setup.js +1 -1
- package/dist/cli-tui/tui-renderer/mcp-events-setup.js.map +1 -1
- package/dist/cli-tui/tui-renderer.js +2 -2
- package/dist/cli-tui/tui-renderer.js.map +1 -1
- package/dist/cli-tui/utils/footer-utils.d.ts +1 -1
- package/dist/cli-tui/utils/footer-utils.js +1 -1
- package/dist/cli-tui/utils/footer-utils.js.map +1 -1
- package/dist/cli.js +15171 -14298
- package/dist/commands/prompts.d.ts +1 -1
- package/dist/commands/prompts.js +1 -1
- package/dist/commands/prompts.js.map +1 -1
- package/dist/config/constants.d.ts +2 -2
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +2 -2
- package/dist/config/constants.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.js +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/toml-config.js +3 -3
- package/dist/config/toml-config.js.map +1 -1
- package/dist/db/client.d.ts +2 -2
- package/dist/db/client.js +2 -2
- package/dist/db/client.js.map +1 -1
- package/dist/db/migrate.d.ts +1 -1
- package/dist/db/migrate.js +1 -1
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/schema.d.ts +2 -2
- package/dist/db/schema.js +1 -1
- package/dist/db/schema.js.map +1 -1
- package/dist/errors/index.d.ts +2 -2
- package/dist/errors/index.js +2 -2
- package/dist/errors/index.js.map +1 -1
- package/dist/main.d.ts +4 -5
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +17 -14
- package/dist/main.js.map +1 -1
- package/dist/mcp/config.d.ts +15 -2
- package/dist/mcp/config.d.ts.map +1 -1
- package/dist/mcp/config.js +50 -26
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp/fathom-cua.d.ts.map +1 -1
- package/dist/mcp/fathom-cua.js +10 -0
- package/dist/mcp/fathom-cua.js.map +1 -1
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +32 -1
- package/dist/mcp/manager.js.map +1 -1
- package/dist/mcp/tool-bridge.d.ts.map +1 -1
- package/dist/mcp/tool-bridge.js +12 -3
- package/dist/mcp/tool-bridge.js.map +1 -1
- package/dist/mcp/tool-capabilities.d.ts +5 -0
- package/dist/mcp/tool-capabilities.d.ts.map +1 -0
- package/dist/mcp/tool-capabilities.js +271 -0
- package/dist/mcp/tool-capabilities.js.map +1 -0
- package/dist/mcp/types.d.ts +6 -1
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/mcp/types.js.map +1 -1
- package/dist/models/config-loader.d.ts +1 -1
- package/dist/models/factory-integration.d.ts +1 -1
- package/dist/models/factory-integration.js +1 -1
- package/dist/models/factory-integration.js.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/artifacts.d.ts +58 -0
- package/dist/node_modules/@evalops/contracts/dist/artifacts.d.ts.map +1 -0
- package/dist/node_modules/@evalops/contracts/dist/artifacts.js +191 -0
- package/dist/node_modules/@evalops/contracts/dist/artifacts.js.map +1 -0
- package/dist/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.d.ts +10 -10
- package/dist/node_modules/@evalops/contracts/dist/index.d.ts +4 -3
- package/dist/node_modules/@evalops/contracts/dist/index.d.ts.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/index.js +3 -2
- package/dist/node_modules/@evalops/contracts/dist/index.js.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts +1182 -14
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js +450 -1
- package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js.map +1 -1
- package/dist/node_modules/@evalops/contracts/dist/runtime-app-server.d.ts +1 -1
- package/dist/node_modules/@evalops/contracts/dist/runtime-server-request.d.ts +3 -3
- package/dist/node_modules/@evalops/contracts/package.json +1 -1
- package/dist/node_modules/@evalops/tui/package.json +1 -1
- package/dist/oauth/connectors.d.ts +2 -2
- package/dist/oauth/connectors.d.ts.map +1 -1
- package/dist/oauth/connectors.js +3 -5
- package/dist/oauth/connectors.js.map +1 -1
- package/dist/oauth/github-copilot.d.ts +1 -1
- package/dist/oauth/github-copilot.js +1 -1
- package/dist/oauth/github-copilot.js.map +1 -1
- package/dist/oauth/index.d.ts +10 -8
- package/dist/oauth/index.d.ts.map +1 -1
- package/dist/oauth/index.js +54 -31
- package/dist/oauth/index.js.map +1 -1
- package/dist/oauth/openai.d.ts +1 -1
- package/dist/oauth/openai.js +2 -2
- package/dist/oauth/openai.js.map +1 -1
- package/dist/platform/a2a-completion-audit.d.ts +41 -0
- package/dist/platform/a2a-completion-audit.d.ts.map +1 -0
- package/dist/platform/a2a-completion-audit.js +177 -0
- package/dist/platform/a2a-completion-audit.js.map +1 -0
- package/dist/platform/a2a-task-ledger.d.ts.map +1 -1
- package/dist/platform/a2a-task-ledger.js +17 -0
- package/dist/platform/a2a-task-ledger.js.map +1 -1
- package/dist/platform/a2a-telemetry-inspect.d.ts +58 -0
- package/dist/platform/a2a-telemetry-inspect.d.ts.map +1 -0
- package/dist/platform/a2a-telemetry-inspect.js +224 -0
- package/dist/platform/a2a-telemetry-inspect.js.map +1 -0
- package/dist/platform/agent-registry-client.d.ts +8 -0
- package/dist/platform/agent-registry-client.d.ts.map +1 -1
- package/dist/platform/agent-registry-client.js +9 -1
- package/dist/platform/agent-registry-client.js.map +1 -1
- package/dist/providers/api-keys.d.ts +2 -2
- package/dist/providers/api-keys.js +2 -2
- package/dist/providers/api-keys.js.map +1 -1
- package/dist/providers/auth.d.ts +3 -6
- package/dist/providers/auth.d.ts.map +1 -1
- package/dist/providers/auth.js +1 -40
- package/dist/providers/auth.js.map +1 -1
- package/dist/rpc/index.d.ts +2 -2
- package/dist/rpc/index.js +2 -2
- package/dist/rpc/index.js.map +1 -1
- package/dist/rpc/rpc-types.d.ts +1 -1
- package/dist/rpc/rpc-types.js +1 -1
- package/dist/rpc/rpc-types.js.map +1 -1
- package/dist/safety/nested-agent-guard.js +1 -1
- package/dist/safety/nested-agent-guard.js.map +1 -1
- package/dist/safety/policy.d.ts +2 -2
- package/dist/safety/policy.js +2 -2
- package/dist/safety/policy.js.map +1 -1
- package/dist/safety/validators/network-policy-validator.d.ts +8 -0
- package/dist/safety/validators/network-policy-validator.d.ts.map +1 -1
- package/dist/safety/validators/network-policy-validator.js +29 -4
- package/dist/safety/validators/network-policy-validator.js.map +1 -1
- package/dist/sandbox/local-sandbox.d.ts +1 -1
- package/dist/sandbox/local-sandbox.js +1 -1
- package/dist/sandbox/local-sandbox.js.map +1 -1
- package/dist/server/app-context.d.ts +2 -0
- package/dist/server/app-context.d.ts.map +1 -1
- package/dist/server/app-context.js.map +1 -1
- package/dist/server/handlers/attachments.d.ts.map +1 -1
- package/dist/server/handlers/attachments.js +1 -0
- package/dist/server/handlers/attachments.js.map +1 -1
- package/dist/server/handlers/models.d.ts.map +1 -1
- package/dist/server/handlers/models.js +3 -1
- package/dist/server/handlers/models.js.map +1 -1
- package/dist/server/handlers/session-artifacts.d.ts.map +1 -1
- package/dist/server/handlers/session-artifacts.js +13 -74
- package/dist/server/handlers/session-artifacts.js.map +1 -1
- package/dist/server/handlers/session-attachments.d.ts.map +1 -1
- package/dist/server/handlers/session-attachments.js +2 -0
- package/dist/server/handlers/session-attachments.js.map +1 -1
- package/dist/server/handlers/sessions.js +1 -1
- package/dist/server/handlers/sessions.js.map +1 -1
- package/dist/server/handlers/status.d.ts +2 -0
- package/dist/server/handlers/status.d.ts.map +1 -1
- package/dist/server/handlers/status.js +3 -2
- package/dist/server/handlers/status.js.map +1 -1
- package/dist/server/headless-runtime-service.d.ts.map +1 -1
- package/dist/server/headless-runtime-service.js +32 -3
- package/dist/server/headless-runtime-service.js.map +1 -1
- package/dist/server/hosted-session-manager.d.ts +2 -0
- package/dist/server/hosted-session-manager.d.ts.map +1 -1
- package/dist/server/hosted-session-manager.js +9 -0
- package/dist/server/hosted-session-manager.js.map +1 -1
- package/dist/server/model-selection.d.ts.map +1 -1
- package/dist/server/model-selection.js +9 -1
- package/dist/server/model-selection.js.map +1 -1
- package/dist/server/rate-limiter.d.ts +1 -1
- package/dist/server/rate-limiter.js +1 -1
- package/dist/server/rate-limiter.js.map +1 -1
- package/dist/server/router.d.ts +2 -2
- package/dist/server/router.js.map +1 -1
- package/dist/server/session-serialization.d.ts +9 -9
- package/dist/server/session-serialization.js +15 -15
- package/dist/server/session-serialization.js.map +1 -1
- package/dist/session/manager.d.ts +5 -0
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js +56 -8
- package/dist/session/manager.js.map +1 -1
- package/dist/session/session-catalog.d.ts +2 -0
- package/dist/session/session-catalog.d.ts.map +1 -1
- package/dist/session/session-catalog.js +6 -0
- package/dist/session/session-catalog.js.map +1 -1
- package/dist/session/session-context.d.ts +2 -0
- package/dist/session/session-context.d.ts.map +1 -1
- package/dist/session/session-context.js +15 -0
- package/dist/session/session-context.js.map +1 -1
- package/dist/session/types.d.ts +7 -0
- package/dist/session/types.d.ts.map +1 -1
- package/dist/session/types.js.map +1 -1
- package/dist/session/wire-format.generated.d.ts +1 -0
- package/dist/session/wire-format.generated.d.ts.map +1 -1
- package/dist/session/wire-format.generated.js +1 -0
- package/dist/session/wire-format.generated.js.map +1 -1
- package/dist/shared-memory/contract.d.ts +4 -4
- package/dist/shared-memory/contract.js +2 -2
- package/dist/shared-memory/contract.js.map +1 -1
- package/dist/telemetry/index.d.ts +2 -2
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +2 -2
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/maestro-event-bus.d.ts +57 -0
- package/dist/telemetry/maestro-event-bus.d.ts.map +1 -1
- package/dist/telemetry/maestro-event-bus.js +59 -1
- package/dist/telemetry/maestro-event-bus.js.map +1 -1
- package/dist/telemetry/maestro-event-catalog.d.ts +17 -1
- package/dist/telemetry/maestro-event-catalog.d.ts.map +1 -1
- package/dist/telemetry/maestro-event-catalog.js +24 -0
- package/dist/telemetry/maestro-event-catalog.js.map +1 -1
- package/dist/telemetry/mcp-beacon.d.ts +2 -0
- package/dist/telemetry/mcp-beacon.d.ts.map +1 -1
- package/dist/telemetry/mcp-beacon.js +15 -0
- package/dist/telemetry/mcp-beacon.js.map +1 -1
- package/dist/telemetry/metrics.d.ts +62 -0
- package/dist/telemetry/metrics.d.ts.map +1 -1
- package/dist/telemetry/metrics.js +84 -0
- package/dist/telemetry/metrics.js.map +1 -1
- package/dist/telemetry.d.ts +44 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +84 -2
- package/dist/telemetry.js.map +1 -1
- package/dist/theme/theme-loader.js +2 -2
- package/dist/theme/theme-loader.js.map +1 -1
- package/dist/theme/theme-schema.json +2 -2
- package/dist/theme/theme.d.ts +1 -1
- package/dist/theme/theme.js.map +1 -1
- package/dist/tools/background/task-types.d.ts +1 -1
- package/dist/tools/extract-document.d.ts +1 -0
- package/dist/tools/extract-document.d.ts.map +1 -1
- package/dist/tools/extract-document.js +2 -1
- package/dist/tools/extract-document.js.map +1 -1
- package/dist/tools/index.d.ts +55 -55
- package/dist/tools/index.js +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/tool-dsl.d.ts +1 -1
- package/dist/tools/tool-dsl.js +1 -1
- package/dist/tools/tool-dsl.js.map +1 -1
- package/dist/utils/document-extractor.d.ts +1 -0
- package/dist/utils/document-extractor.d.ts.map +1 -1
- package/dist/utils/document-extractor.js +320 -40
- package/dist/utils/document-extractor.js.map +1 -1
- package/dist/utils/logger.d.ts +1 -1
- package/dist/utils/logger.js +1 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/version.json +2 -2
- package/dist/web-server.d.ts +1 -1
- package/dist/web-server.d.ts.map +1 -1
- package/dist/web-server.js +12 -8
- package/dist/web-server.js.map +1 -1
- package/package.json +4 -2
- package/dist/oauth/anthropic.d.ts +0 -17
- package/dist/oauth/anthropic.d.ts.map +0 -1
- package/dist/oauth/anthropic.js +0 -81
- package/dist/oauth/anthropic.js.map +0 -1
- package/dist/providers/anthropic-auth.d.ts +0 -75
- package/dist/providers/anthropic-auth.d.ts.map +0 -1
- package/dist/providers/anthropic-auth.js +0 -221
- package/dist/providers/anthropic-auth.js.map +0 -1
package/dist/mcp/config.js
CHANGED
|
@@ -8,11 +8,11 @@
|
|
|
8
8
|
* ## Configuration Sources (precedence order)
|
|
9
9
|
*
|
|
10
10
|
* 1. **Enterprise**: `~/.maestro/enterprise/mcp.json` (highest; legacy
|
|
11
|
-
*
|
|
11
|
+
* `.composer` enterprise MCP config remains a fallback)
|
|
12
12
|
* 2. **Plugin**: Programmatically provided servers
|
|
13
13
|
* 3. **Project**: `.maestro/mcp.json` in project root
|
|
14
14
|
* 4. **Local**: `.maestro/mcp.local.json` (git-ignored)
|
|
15
|
-
* 5. **User**: `~/.maestro/mcp.json` (lowest; legacy
|
|
15
|
+
* 5. **User**: `~/.maestro/mcp.json` (lowest; legacy `.composer` user MCP config
|
|
16
16
|
* remains a fallback)
|
|
17
17
|
*
|
|
18
18
|
* ## Configuration Format
|
|
@@ -191,14 +191,35 @@ export function inferRemoteMcpTransport(url) {
|
|
|
191
191
|
return isSseUrl(url) ? "sse" : "http";
|
|
192
192
|
}
|
|
193
193
|
export function addMcpServerToConfig(options) {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
(options.server.url
|
|
199
|
-
? inferRemoteMcpTransport(options.server.url)
|
|
200
|
-
: "stdio"),
|
|
194
|
+
return addMcpServersToConfig({
|
|
195
|
+
projectRoot: options.projectRoot,
|
|
196
|
+
scope: options.scope,
|
|
197
|
+
servers: [options.server],
|
|
201
198
|
});
|
|
199
|
+
}
|
|
200
|
+
export function validateMcpServersForConfig(options) {
|
|
201
|
+
const { path } = prepareMcpServersConfigUpdate(options);
|
|
202
|
+
return { path };
|
|
203
|
+
}
|
|
204
|
+
export function addMcpServersToConfig(options) {
|
|
205
|
+
const { path, nextConfig } = prepareMcpServersConfigUpdate(options);
|
|
206
|
+
writeJsonFile(path, nextConfig);
|
|
207
|
+
return { path };
|
|
208
|
+
}
|
|
209
|
+
function prepareMcpServersConfigUpdate(options) {
|
|
210
|
+
const path = getWritableMcpConfigPath(options.scope, options.projectRoot);
|
|
211
|
+
const validatedServers = options.servers.map((server) => mcpServerSchema.parse({
|
|
212
|
+
...server,
|
|
213
|
+
transport: server.transport ??
|
|
214
|
+
(server.url ? inferRemoteMcpTransport(server.url) : "stdio"),
|
|
215
|
+
}));
|
|
216
|
+
const seenNames = new Set();
|
|
217
|
+
for (const server of validatedServers) {
|
|
218
|
+
if (seenNames.has(server.name)) {
|
|
219
|
+
throw new Error(`MCP server "${server.name}" is listed more than once`);
|
|
220
|
+
}
|
|
221
|
+
seenNames.add(server.name);
|
|
222
|
+
}
|
|
202
223
|
const existing = readJsonFile(path, { fallback: {} });
|
|
203
224
|
const parsed = mcpConfigSchema.safeParse(existing);
|
|
204
225
|
if (!parsed.success) {
|
|
@@ -210,29 +231,32 @@ export function addMcpServerToConfig(options) {
|
|
|
210
231
|
const existingServers = isRecord(nextConfig.mcpServers)
|
|
211
232
|
? nextConfig.mcpServers
|
|
212
233
|
: {};
|
|
213
|
-
|
|
214
|
-
|
|
234
|
+
const nextServers = { ...existingServers };
|
|
235
|
+
for (const server of validatedServers) {
|
|
236
|
+
if (Object.prototype.hasOwnProperty.call(nextServers, server.name)) {
|
|
237
|
+
throw new Error(`MCP server "${server.name}" already exists in ${path}`);
|
|
238
|
+
}
|
|
239
|
+
nextServers[server.name] = buildPersistedServerConfig(server);
|
|
215
240
|
}
|
|
216
|
-
nextConfig.mcpServers =
|
|
217
|
-
...existingServers,
|
|
218
|
-
[validatedServer.name]: buildPersistedServerConfig(validatedServer),
|
|
219
|
-
};
|
|
241
|
+
nextConfig.mcpServers = nextServers;
|
|
220
242
|
}
|
|
221
243
|
else {
|
|
222
244
|
const servers = nextConfig.servers ?? [];
|
|
223
|
-
|
|
224
|
-
|
|
245
|
+
const existingNames = new Set(servers.map((server) => server.name));
|
|
246
|
+
const nextServers = [...servers];
|
|
247
|
+
for (const server of validatedServers) {
|
|
248
|
+
if (existingNames.has(server.name)) {
|
|
249
|
+
throw new Error(`MCP server "${server.name}" already exists in ${path}`);
|
|
250
|
+
}
|
|
251
|
+
existingNames.add(server.name);
|
|
252
|
+
nextServers.push({
|
|
253
|
+
...buildPersistedServerConfig(server),
|
|
254
|
+
name: server.name,
|
|
255
|
+
});
|
|
225
256
|
}
|
|
226
|
-
nextConfig.servers =
|
|
227
|
-
...servers,
|
|
228
|
-
{
|
|
229
|
-
...buildPersistedServerConfig(validatedServer),
|
|
230
|
-
name: validatedServer.name,
|
|
231
|
-
},
|
|
232
|
-
];
|
|
257
|
+
nextConfig.servers = nextServers;
|
|
233
258
|
}
|
|
234
|
-
|
|
235
|
-
return { path };
|
|
259
|
+
return { path, nextConfig };
|
|
236
260
|
}
|
|
237
261
|
export function addMcpAuthPresetToConfig(options) {
|
|
238
262
|
const path = getWritableMcpConfigPath(options.scope, options.projectRoot);
|
package/dist/mcp/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MCP Configuration - Model Context Protocol Server Management\n *\n * This module handles loading and merging MCP (Model Context Protocol)\n * server configurations from multiple sources. MCP servers extend the\n * agent's capabilities with additional tools and integrations.\n *\n * ## Configuration Sources (precedence order)\n *\n * 1. **Enterprise**: `~/.maestro/enterprise/mcp.json` (highest; legacy\n * Composer enterprise MCP config remains a fallback)\n * 2. **Plugin**: Programmatically provided servers\n * 3. **Project**: `.maestro/mcp.json` in project root\n * 4. **Local**: `.maestro/mcp.local.json` (git-ignored)\n * 5. **User**: `~/.maestro/mcp.json` (lowest; legacy Composer user MCP config\n * remains a fallback)\n *\n * ## Configuration Format\n *\n * ```json\n * {\n * \"servers\": [\n * {\n * \"name\": \"my-server\",\n * \"transport\": \"stdio\",\n * \"command\": \"node\",\n * \"args\": [\"path/to/server.js\"],\n * \"env\": { \"API_KEY\": \"${MY_API_KEY}\" }\n * }\n * ],\n * \"mcpServers\": {\n * \"another-server\": {\n * \"command\": \"python\",\n * \"args\": [\"-m\", \"my_mcp_server\"]\n * }\n * }\n * }\n * ```\n *\n * ## Transport Types\n *\n * | Transport | Description |\n * |-----------|------------------------------------------|\n * | stdio | Communicate via stdin/stdout (default) |\n * | http | HTTP-based transport |\n * | sse | Server-Sent Events transport |\n *\n * ## Environment Variable Expansion\n *\n * Supports `${VAR}` and `${VAR:-default}` syntax in:\n * - command, args, url, cwd, headersHelper\n * - env values\n * - headers\n *\n * @module mcp/config\n */\n\nimport { readFileSync, statSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport type { z } from \"zod\";\nimport { PATHS } from \"../config/constants.js\";\nimport { readJsonFile, writeJsonFile } from \"../utils/fs.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { getHomeDir, resolveEnvPath } from \"../utils/path-expansion.js\";\nimport { uniquePaths } from \"../utils/path-utils.js\";\nimport { defaultEnvValidators, evaluateEnvValidators } from \"./env-limits.js\";\nimport { getFathomCuaPluginServers } from \"./fathom-cua.js\";\nimport { getPlatformMcpPluginServers } from \"./platform-plugin.js\";\nimport {\n\ttype McpAuthPresetInput,\n\ttype McpServerInput,\n\tmcpAuthPresetSchema,\n\tmcpConfigSchema,\n\tmcpServerSchema,\n\tmcpWorkspaceTrustDefaultSchema,\n\tmcpWorkspaceTrustEntrySchema,\n} from \"./schema.js\";\nimport type {\n\tMcpAuthPresetConfig,\n\tMcpConfig,\n\tMcpScope,\n\tMcpServerConfig,\n\tMcpWorkspaceTrustDefault,\n\tMcpWorkspaceTrustEntry,\n} from \"./types.js\";\n\nconst logger = createLogger(\"mcp:config\");\n\nconst PROJECT_CONFIG_NAME = \".maestro/mcp.json\";\nconst LOCAL_CONFIG_NAME = \".maestro/mcp.local.json\";\n\nconst getEnterpriseConfigPathOverride = (): string | null =>\n\tresolveEnvPath(process.env.MAESTRO_ENTERPRISE_MCP_PATH);\n\nconst getDefaultEnterpriseConfigPath = (): string =>\n\tjoin(PATHS.MAESTRO_HOME, \"enterprise\", \"mcp.json\");\n\nconst getEnterpriseConfigPath = (): string =>\n\tgetEnterpriseConfigPathOverride() ?? getDefaultEnterpriseConfigPath();\n\nconst getUserConfigPathOverride = (): string | null =>\n\tresolveEnvPath(process.env.MAESTRO_USER_MCP_PATH);\n\nconst getDefaultUserConfigPath = (): string =>\n\tjoin(PATHS.MAESTRO_HOME, \"mcp.json\");\n\nconst getUserConfigPath = (): string =>\n\tgetUserConfigPathOverride() ?? getDefaultUserConfigPath();\n\nconst getLegacyEnterpriseConfigPath = (): string =>\n\tjoin(getHomeDir(), \".composer\", \"enterprise\", \"mcp.json\");\n\nconst getLegacyUserConfigPath = (): string =>\n\tjoin(getHomeDir(), \".composer\", \"mcp.json\");\n\nfunction isConfigFile(path: string): boolean {\n\ttry {\n\t\treturn statSync(path).isFile();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction selectEffectiveConfigPath(paths: string[]): string {\n\treturn paths.find(isConfigFile) ?? paths[0]!;\n}\n\nconst getUserConfigPathCandidates = (): string[] => {\n\tconst overridePath = getUserConfigPathOverride();\n\tif (overridePath) {\n\t\treturn [overridePath];\n\t}\n\treturn uniquePaths([getDefaultUserConfigPath(), getLegacyUserConfigPath()]);\n};\n\nconst getEnterpriseConfigPathCandidates = (): string[] => {\n\tconst overridePath = getEnterpriseConfigPathOverride();\n\tif (overridePath) {\n\t\treturn [overridePath];\n\t}\n\treturn uniquePaths([\n\t\tgetDefaultEnterpriseConfigPath(),\n\t\tgetLegacyEnterpriseConfigPath(),\n\t]);\n};\n\nconst getEffectiveUserConfigPath = (): string =>\n\tselectEffectiveConfigPath(getUserConfigPathCandidates());\n\nconst getEffectiveEnterpriseConfigPath = (): string =>\n\tselectEffectiveConfigPath(getEnterpriseConfigPathCandidates());\n\ntype ParsedConfig = {\n\tservers: McpServerConfig[];\n\tauthPresets: McpAuthPresetConfig[];\n\ttrustedWorkspaces: Record<string, McpWorkspaceTrustEntry[]>;\n\tworkspaceTrustDefault?: McpWorkspaceTrustDefault;\n};\ntype RawMcpConfigFile = z.infer<typeof mcpConfigSchema>;\ntype PersistedMcpAuthPresetConfig = Omit<McpAuthPresetInput, \"name\">;\ntype PersistedMcpServerConfig = Omit<McpServerInput, \"name\">;\nexport type WritableMcpScope = Exclude<McpScope, \"enterprise\" | \"plugin\">;\n\nexport interface LoadMcpOptions {\n\tpluginServers?: McpServerConfig[];\n\tincludeEnvLimits?: boolean;\n}\n\nexport interface AddMcpServerOptions {\n\tprojectRoot?: string;\n\tscope: WritableMcpScope;\n\tserver: McpServerInput & { name: string };\n}\n\nexport interface AddMcpAuthPresetOptions {\n\tprojectRoot?: string;\n\tscope: WritableMcpScope;\n\tpreset: McpAuthPresetInput & { name: string };\n}\n\nexport interface RemoveMcpServerOptions {\n\tprojectRoot?: string;\n\tscope?: WritableMcpScope;\n\tname: string;\n}\n\nexport interface RemoveMcpAuthPresetOptions {\n\tprojectRoot?: string;\n\tscope?: WritableMcpScope;\n\tname: string;\n}\n\nexport interface UpdateMcpServerOptions {\n\tprojectRoot?: string;\n\tscope?: WritableMcpScope;\n\tname: string;\n\tserver: McpServerInput & { name: string };\n}\n\nexport interface UpdateMcpAuthPresetOptions {\n\tprojectRoot?: string;\n\tscope?: WritableMcpScope;\n\tname: string;\n\tpreset: McpAuthPresetInput & { name: string };\n}\n\nexport function loadMcpConfig(\n\tprojectRoot?: string,\n\toptions: LoadMcpOptions = {},\n): McpConfig {\n\tconst userCfg = parseConfigFile(getEffectiveUserConfigPath(), \"user\");\n\tconst enterpriseCfg = parseConfigFile(\n\t\tgetEffectiveEnterpriseConfigPath(),\n\t\t\"enterprise\",\n\t);\n\tconst projectCfg = projectRoot\n\t\t? parseConfigFile(resolve(projectRoot, PROJECT_CONFIG_NAME), \"project\")\n\t\t: { servers: [], authPresets: [], trustedWorkspaces: {} };\n\tconst localCfg = projectRoot\n\t\t? parseConfigFile(resolve(projectRoot, LOCAL_CONFIG_NAME), \"local\")\n\t\t: { servers: [], authPresets: [], trustedWorkspaces: {} };\n\tconst pluginCfg: ParsedConfig = {\n\t\tservers: [\n\t\t\t...getPlatformMcpPluginServers(),\n\t\t\t...getFathomCuaPluginServers(),\n\t\t\t...(options.pluginServers ?? []),\n\t\t],\n\t\tauthPresets: [],\n\t\ttrustedWorkspaces: {},\n\t};\n\n\tconst merged = new Map<string, McpServerConfig>();\n\tconst mergedAuthPresets = new Map<string, McpAuthPresetConfig>();\n\tconst mergedTrustedWorkspaces: Record<string, McpWorkspaceTrustEntry[]> = {};\n\tlet workspaceTrustDefault: McpWorkspaceTrustDefault | undefined;\n\t// precedence: enterprise -> plugin -> project -> local -> user\n\t// lower precedence first, higher precedence last so later overrides earlier\n\tfor (const src of [userCfg, localCfg, projectCfg, pluginCfg, enterpriseCfg]) {\n\t\tfor (const authPreset of src.authPresets) {\n\t\t\tmergedAuthPresets.set(authPreset.name, authPreset);\n\t\t}\n\t\tfor (const server of src.servers) {\n\t\t\t// A higher-precedence config can explicitly disable a server defined earlier.\n\t\t\tif (server.enabled === false || server.disabled === true) {\n\t\t\t\tmerged.delete(server.name);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmerged.set(server.name, server);\n\t\t}\n\t\tfor (const [serverName, entries] of Object.entries(src.trustedWorkspaces)) {\n\t\t\tmergedTrustedWorkspaces[serverName] = [\n\t\t\t\t...(mergedTrustedWorkspaces[serverName] ?? []),\n\t\t\t\t...entries,\n\t\t\t];\n\t\t}\n\t\tif (src.workspaceTrustDefault) {\n\t\t\tworkspaceTrustDefault = src.workspaceTrustDefault;\n\t\t}\n\t}\n\n\tconst envLimits = options.includeEnvLimits\n\t\t? evaluateEnvValidators(defaultEnvValidators)\n\t\t: undefined;\n\n\treturn {\n\t\tservers: Array.from(merged.values()),\n\t\tauthPresets: Array.from(mergedAuthPresets.values()),\n\t\tprojectRoot: projectRoot ? resolve(projectRoot) : undefined,\n\t\ttrustedWorkspaces:\n\t\t\tObject.keys(mergedTrustedWorkspaces).length > 0\n\t\t\t\t? mergedTrustedWorkspaces\n\t\t\t\t: undefined,\n\t\tworkspaceTrustDefault,\n\t\tenvLimits,\n\t};\n}\n\nexport function getConfigPaths(projectRoot?: string): string[] {\n\tconst paths = [\n\t\tgetEffectiveUserConfigPath(),\n\t\tgetEffectiveEnterpriseConfigPath(),\n\t];\n\tif (projectRoot) {\n\t\tpaths.push(resolve(projectRoot, PROJECT_CONFIG_NAME));\n\t\tpaths.push(resolve(projectRoot, LOCAL_CONFIG_NAME));\n\t}\n\treturn paths;\n}\n\nexport function getWritableMcpConfigPath(\n\tscope: WritableMcpScope,\n\tprojectRoot = process.cwd(),\n): string {\n\tswitch (scope) {\n\t\tcase \"user\":\n\t\t\treturn getEffectiveUserConfigPath();\n\t\tcase \"project\":\n\t\t\treturn resolve(projectRoot, PROJECT_CONFIG_NAME);\n\t\tcase \"local\":\n\t\t\treturn resolve(projectRoot, LOCAL_CONFIG_NAME);\n\t}\n}\n\nexport function inferRemoteMcpTransport(url: string): \"http\" | \"sse\" {\n\treturn isSseUrl(url) ? \"sse\" : \"http\";\n}\n\nexport function addMcpServerToConfig(options: AddMcpServerOptions): {\n\tpath: string;\n} {\n\tconst path = getWritableMcpConfigPath(options.scope, options.projectRoot);\n\tconst validatedServer = mcpServerSchema.parse({\n\t\t...options.server,\n\t\ttransport:\n\t\t\toptions.server.transport ??\n\t\t\t(options.server.url\n\t\t\t\t? inferRemoteMcpTransport(options.server.url)\n\t\t\t\t: \"stdio\"),\n\t});\n\tconst existing = readJsonFile<unknown>(path, { fallback: {} });\n\tconst parsed = mcpConfigSchema.safeParse(existing);\n\tif (!parsed.success) {\n\t\tthrow new Error(\n\t\t\t`Invalid MCP config at ${path}: ${parsed.error.issues.map((issue) => issue.message).join(\"; \")}`,\n\t\t);\n\t}\n\n\tconst nextConfig = structuredClone(parsed.data) as RawMcpConfigFile;\n\tconst hasObjectFormat =\n\t\tisRecord(nextConfig.mcpServers) || !Array.isArray(nextConfig.servers);\n\tif (hasObjectFormat) {\n\t\tconst existingServers = isRecord(nextConfig.mcpServers)\n\t\t\t? nextConfig.mcpServers\n\t\t\t: {};\n\t\tif (\n\t\t\tObject.prototype.hasOwnProperty.call(\n\t\t\t\texistingServers,\n\t\t\t\tvalidatedServer.name,\n\t\t\t)\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t`MCP server \"${validatedServer.name}\" already exists in ${path}`,\n\t\t\t);\n\t\t}\n\t\tnextConfig.mcpServers = {\n\t\t\t...existingServers,\n\t\t\t[validatedServer.name]: buildPersistedServerConfig(validatedServer),\n\t\t};\n\t} else {\n\t\tconst servers = nextConfig.servers ?? [];\n\t\tif (servers.some((server) => server.name === validatedServer.name)) {\n\t\t\tthrow new Error(\n\t\t\t\t`MCP server \"${validatedServer.name}\" already exists in ${path}`,\n\t\t\t);\n\t\t}\n\t\tnextConfig.servers = [\n\t\t\t...servers,\n\t\t\t{\n\t\t\t\t...buildPersistedServerConfig(validatedServer),\n\t\t\t\tname: validatedServer.name,\n\t\t\t},\n\t\t];\n\t}\n\n\twriteJsonFile(path, nextConfig);\n\treturn { path };\n}\n\nexport function addMcpAuthPresetToConfig(options: AddMcpAuthPresetOptions): {\n\tpath: string;\n} {\n\tconst path = getWritableMcpConfigPath(options.scope, options.projectRoot);\n\tconst validatedPreset = mcpAuthPresetSchema.parse(options.preset);\n\tconst existing = readJsonFile<unknown>(path, { fallback: {} });\n\tconst parsed = mcpConfigSchema.safeParse(existing);\n\tif (!parsed.success) {\n\t\tthrow new Error(\n\t\t\t`Invalid MCP config at ${path}: ${parsed.error.issues.map((issue) => issue.message).join(\"; \")}`,\n\t\t);\n\t}\n\n\tconst nextConfig = structuredClone(parsed.data) as RawMcpConfigFile;\n\tconst existingPresets = isRecord(nextConfig.authPresets)\n\t\t? nextConfig.authPresets\n\t\t: {};\n\tif (\n\t\tObject.prototype.hasOwnProperty.call(existingPresets, validatedPreset.name)\n\t) {\n\t\tthrow new Error(\n\t\t\t`MCP auth preset \"${validatedPreset.name}\" already exists in ${path}`,\n\t\t);\n\t}\n\n\tnextConfig.authPresets = {\n\t\t...existingPresets,\n\t\t[validatedPreset.name]: buildPersistedAuthPresetConfig(validatedPreset),\n\t};\n\n\twriteJsonFile(path, nextConfig);\n\treturn { path };\n}\n\nexport function removeMcpServerFromConfig(options: RemoveMcpServerOptions): {\n\tpath: string;\n\tscope: WritableMcpScope;\n} {\n\tconst projectRoot = options.projectRoot ?? process.cwd();\n\tconst scope = resolveWritableMutationScope(\n\t\toptions.name,\n\t\toptions.scope,\n\t\tprojectRoot,\n\t);\n\tconst { path, config } = readWritableMcpConfig(scope, projectRoot);\n\tconst nextConfig = structuredClone(config) as RawMcpConfigFile;\n\tconst removed = mutateWritableMcpConfig(nextConfig, options.name, \"remove\");\n\tif (!removed) {\n\t\tthrow new Error(`MCP server \"${options.name}\" not found in ${path}`);\n\t}\n\n\twriteJsonFile(path, nextConfig);\n\treturn { path, scope };\n}\n\nexport function removeMcpAuthPresetFromConfig(\n\toptions: RemoveMcpAuthPresetOptions,\n): {\n\tpath: string;\n\tscope: WritableMcpScope;\n} {\n\tconst projectRoot = options.projectRoot ?? process.cwd();\n\tconst scope = resolveWritableAuthPresetMutationScope(\n\t\toptions.name,\n\t\toptions.scope,\n\t\tprojectRoot,\n\t);\n\tconst { path, config } = readWritableMcpConfig(scope, projectRoot);\n\tconst nextConfig = structuredClone(config) as RawMcpConfigFile;\n\tconst removed = mutateWritableMcpAuthPresetConfig(\n\t\tnextConfig,\n\t\toptions.name,\n\t\t\"remove\",\n\t);\n\tif (!removed) {\n\t\tthrow new Error(`MCP auth preset \"${options.name}\" not found in ${path}`);\n\t}\n\n\twriteJsonFile(path, nextConfig);\n\treturn { path, scope };\n}\n\nexport function updateMcpServerInConfig(options: UpdateMcpServerOptions): {\n\tpath: string;\n\tscope: WritableMcpScope;\n} {\n\tconst projectRoot = options.projectRoot ?? process.cwd();\n\tconst scope = resolveWritableMutationScope(\n\t\toptions.name,\n\t\toptions.scope,\n\t\tprojectRoot,\n\t);\n\tif (options.server.name !== options.name) {\n\t\tthrow new Error(\"Renaming MCP servers is not supported by /mcp edit.\");\n\t}\n\n\tconst validatedServer = mcpServerSchema.parse({\n\t\t...options.server,\n\t\ttransport:\n\t\t\toptions.server.transport ??\n\t\t\t(options.server.url\n\t\t\t\t? inferRemoteMcpTransport(options.server.url)\n\t\t\t\t: \"stdio\"),\n\t});\n\tconst { path, config } = readWritableMcpConfig(scope, projectRoot);\n\tconst nextConfig = structuredClone(config) as RawMcpConfigFile;\n\tconst updated = mutateWritableMcpConfig(nextConfig, options.name, \"update\", {\n\t\tserver: validatedServer,\n\t});\n\tif (!updated) {\n\t\tthrow new Error(`MCP server \"${options.name}\" not found in ${path}`);\n\t}\n\n\twriteJsonFile(path, nextConfig);\n\treturn { path, scope };\n}\n\nexport function updateMcpAuthPresetInConfig(\n\toptions: UpdateMcpAuthPresetOptions,\n): {\n\tpath: string;\n\tscope: WritableMcpScope;\n} {\n\tconst projectRoot = options.projectRoot ?? process.cwd();\n\tconst scope = resolveWritableAuthPresetMutationScope(\n\t\toptions.name,\n\t\toptions.scope,\n\t\tprojectRoot,\n\t);\n\tif (options.preset.name !== options.name) {\n\t\tthrow new Error(\"Renaming MCP auth presets is not supported.\");\n\t}\n\n\tconst validatedPreset = mcpAuthPresetSchema.parse(options.preset);\n\tconst { path, config } = readWritableMcpConfig(scope, projectRoot);\n\tconst nextConfig = structuredClone(config) as RawMcpConfigFile;\n\tconst updated = mutateWritableMcpAuthPresetConfig(\n\t\tnextConfig,\n\t\toptions.name,\n\t\t\"update\",\n\t\t{\n\t\t\tpreset: validatedPreset,\n\t\t},\n\t);\n\tif (!updated) {\n\t\tthrow new Error(`MCP auth preset \"${options.name}\" not found in ${path}`);\n\t}\n\n\twriteJsonFile(path, nextConfig);\n\treturn { path, scope };\n}\n\nfunction parseConfigFile(path: string, scope: McpScope): ParsedConfig {\n\tif (!isConfigFile(path)) {\n\t\treturn { servers: [], authPresets: [], trustedWorkspaces: {} };\n\t}\n\ttry {\n\t\tconst content = readFileSync(path, \"utf-8\");\n\t\tconst json = JSON.parse(content);\n\t\tconst parsed = mcpConfigSchema.safeParse(json);\n\t\tif (!parsed.success) {\n\t\t\tlogger.warn(\"Invalid MCP config\", {\n\t\t\t\tscope,\n\t\t\t\tpath,\n\t\t\t\terror: parsed.error.issues.map((e) => e.message).join(\"; \"),\n\t\t\t});\n\t\t\treturn { servers: [], authPresets: [], trustedWorkspaces: {} };\n\t\t}\n\n\t\tconst servers: McpServerConfig[] = [];\n\t\tconst authPresets: McpAuthPresetConfig[] = [];\n\t\tif (Array.isArray(parsed.data.servers)) {\n\t\t\tfor (const server of parsed.data.servers) {\n\t\t\t\tconst normalized = normalizeServer(server, server.name, scope);\n\t\t\t\tif (normalized) servers.push(normalized);\n\t\t\t}\n\t\t}\n\t\tif (parsed.data.mcpServers) {\n\t\t\tfor (const [name, raw] of Object.entries(parsed.data.mcpServers)) {\n\t\t\t\tconst merged: McpServerInput | { name: string } = isRecord(raw)\n\t\t\t\t\t? ({ ...raw, name } as McpServerInput)\n\t\t\t\t\t: { name };\n\t\t\t\tconst normalized = normalizeServer(merged, name, scope);\n\t\t\t\tif (normalized) servers.push(normalized);\n\t\t\t}\n\t\t}\n\t\tif (parsed.data.authPresets) {\n\t\t\tfor (const [name, raw] of Object.entries(parsed.data.authPresets)) {\n\t\t\t\tconst merged: McpAuthPresetInput | { name: string } = isRecord(raw)\n\t\t\t\t\t? ({ ...raw, name } as McpAuthPresetInput)\n\t\t\t\t\t: { name };\n\t\t\t\tconst normalized = normalizeAuthPreset(merged, name, scope);\n\t\t\t\tif (normalized) authPresets.push(normalized);\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tservers,\n\t\t\tauthPresets,\n\t\t\ttrustedWorkspaces: normalizeTrustedWorkspaces(\n\t\t\t\tparsed.data.trustedWorkspaces,\n\t\t\t\tscope,\n\t\t\t\tpath,\n\t\t\t),\n\t\t\tworkspaceTrustDefault: normalizeWorkspaceTrustDefault(\n\t\t\t\tparsed.data.workspaceTrustDefault,\n\t\t\t\tscope,\n\t\t\t\tpath,\n\t\t\t),\n\t\t};\n\t} catch (error) {\n\t\tlogger.warn(\"Failed to parse MCP config file\", {\n\t\t\tpath,\n\t\t\tscope,\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\tstack: error instanceof Error ? error.stack : undefined,\n\t\t});\n\t\treturn { servers: [], authPresets: [], trustedWorkspaces: {} };\n\t}\n}\n\nfunction normalizeWorkspaceTrustDefault(\n\traw: unknown,\n\tscope: McpScope,\n\tpath: string,\n): McpWorkspaceTrustDefault | undefined {\n\tif (raw === undefined) {\n\t\treturn undefined;\n\t}\n\tconst parsed = mcpWorkspaceTrustDefaultSchema.safeParse(raw);\n\tif (parsed.success) {\n\t\treturn parsed.data;\n\t}\n\tlogger.warn(\"Invalid MCP workspaceTrustDefault\", {\n\t\tscope,\n\t\tpath,\n\t\terror: parsed.error.issues.map((issue) => issue.message).join(\"; \"),\n\t});\n\treturn undefined;\n}\n\nfunction normalizeTrustedWorkspaces(\n\traw: unknown,\n\tscope: McpScope,\n\tpath: string,\n): Record<string, McpWorkspaceTrustEntry[]> {\n\tif (raw === undefined) {\n\t\treturn {};\n\t}\n\tif (!isRecord(raw)) {\n\t\tlogger.warn(\"Invalid MCP trustedWorkspaces\", {\n\t\t\tscope,\n\t\t\tpath,\n\t\t\terror: \"expected an object keyed by MCP server name\",\n\t\t});\n\t\treturn {};\n\t}\n\tconst trustedWorkspaces: Record<string, McpWorkspaceTrustEntry[]> = {};\n\tfor (const [serverName, entries] of Object.entries(raw)) {\n\t\tif (!Array.isArray(entries)) {\n\t\t\tlogger.warn(\"Invalid MCP trustedWorkspaces entry\", {\n\t\t\t\tscope,\n\t\t\t\tpath,\n\t\t\t\tserverName,\n\t\t\t\terror: \"expected an array of workspace trust entries\",\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tconst validEntries: McpWorkspaceTrustEntry[] = [];\n\t\tfor (const [index, entry] of entries.entries()) {\n\t\t\tconst parsed = mcpWorkspaceTrustEntrySchema.safeParse(entry);\n\t\t\tif (!parsed.success) {\n\t\t\t\tlogger.warn(\"Invalid MCP trusted workspace entry\", {\n\t\t\t\t\tscope,\n\t\t\t\t\tpath,\n\t\t\t\t\tserverName,\n\t\t\t\t\tindex,\n\t\t\t\t\terror: parsed.error.issues.map((issue) => issue.message).join(\"; \"),\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvalidEntries.push(parsed.data);\n\t\t}\n\t\tif (validEntries.length > 0) {\n\t\t\ttrustedWorkspaces[serverName] = validEntries;\n\t\t}\n\t}\n\treturn trustedWorkspaces;\n}\n\nfunction readWritableMcpConfig(\n\tscope: WritableMcpScope,\n\tprojectRoot: string,\n): {\n\tpath: string;\n\tconfig: RawMcpConfigFile;\n} {\n\tconst path = getWritableMcpConfigPath(scope, projectRoot);\n\tconst existing = readJsonFile<unknown>(path, { fallback: {} });\n\tconst parsed = mcpConfigSchema.safeParse(existing);\n\tif (!parsed.success) {\n\t\tthrow new Error(\n\t\t\t`Invalid MCP config at ${path}: ${parsed.error.issues.map((issue) => issue.message).join(\"; \")}`,\n\t\t);\n\t}\n\treturn { path, config: parsed.data };\n}\n\nfunction resolveWritableMutationScope(\n\tname: string,\n\tscope: WritableMcpScope | undefined,\n\tprojectRoot: string,\n): WritableMcpScope {\n\tif (scope) {\n\t\treturn scope;\n\t}\n\n\tconst activeServer = loadMcpConfig(projectRoot).servers.find(\n\t\t(server) => server.name === name,\n\t);\n\tif (!activeServer) {\n\t\tthrow new Error(`MCP server \"${name}\" not found in merged config.`);\n\t}\n\tif (!isWritableScope(activeServer.scope)) {\n\t\tthrow new Error(\n\t\t\t`MCP server \"${name}\" is managed by ${activeServer.scope ?? \"an unknown\"} scope and cannot be edited here.`,\n\t\t);\n\t}\n\treturn activeServer.scope;\n}\n\nfunction resolveWritableAuthPresetMutationScope(\n\tname: string,\n\tscope: WritableMcpScope | undefined,\n\tprojectRoot: string,\n): WritableMcpScope {\n\tif (scope) {\n\t\treturn scope;\n\t}\n\n\tconst activePreset = loadMcpConfig(projectRoot).authPresets.find(\n\t\t(preset) => preset.name === name,\n\t);\n\tif (!activePreset) {\n\t\tthrow new Error(`MCP auth preset \"${name}\" not found in merged config.`);\n\t}\n\tif (!isWritableScope(activePreset.scope)) {\n\t\tthrow new Error(\n\t\t\t`MCP auth preset \"${name}\" is managed by ${activePreset.scope ?? \"an unknown\"} scope and cannot be edited here.`,\n\t\t);\n\t}\n\treturn activePreset.scope;\n}\n\nfunction mutateWritableMcpConfig(\n\tconfig: RawMcpConfigFile,\n\tname: string,\n\tmode: \"remove\" | \"update\",\n\toptions?: { server: McpServerInput & { name: string } },\n): boolean {\n\tif (\n\t\tisRecord(config.mcpServers) &&\n\t\tObject.prototype.hasOwnProperty.call(config.mcpServers, name)\n\t) {\n\t\tif (mode === \"remove\") {\n\t\t\tdelete config.mcpServers[name];\n\t\t} else {\n\t\t\tconfig.mcpServers[name] = buildPersistedServerConfig(options!.server);\n\t\t}\n\t\treturn true;\n\t}\n\n\tif (Array.isArray(config.servers)) {\n\t\tconst index = config.servers.findIndex((server) => server.name === name);\n\t\tif (index >= 0) {\n\t\t\tif (mode === \"remove\") {\n\t\t\t\tconfig.servers.splice(index, 1);\n\t\t\t} else {\n\t\t\t\tconfig.servers[index] = {\n\t\t\t\t\t...buildPersistedServerConfig(options!.server),\n\t\t\t\t\tname: options!.server.name,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nfunction mutateWritableMcpAuthPresetConfig(\n\tconfig: RawMcpConfigFile,\n\tname: string,\n\tmode: \"remove\" | \"update\",\n\toptions?: {\n\t\tpreset: McpAuthPresetInput & { name: string };\n\t},\n): boolean {\n\tif (\n\t\tisRecord(config.authPresets) &&\n\t\tObject.prototype.hasOwnProperty.call(config.authPresets, name)\n\t) {\n\t\tif (mode === \"remove\") {\n\t\t\tdelete config.authPresets[name];\n\t\t} else {\n\t\t\tconfig.authPresets[name] = buildPersistedAuthPresetConfig(\n\t\t\t\toptions!.preset,\n\t\t\t);\n\t\t}\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nfunction normalizeServer(\n\tserver: McpServerInput,\n\tname: string,\n\tscope: McpScope,\n): McpServerConfig | null {\n\tconst transport = resolveTransport(server);\n\tconst expanded = expandServerEnv({ ...server, name, transport });\n\n\tconst validated = mcpServerSchema.safeParse(expanded);\n\tif (!validated.success) {\n\t\tlogger.warn(\"Invalid MCP server entry\", {\n\t\t\tscope,\n\t\t\tname,\n\t\t\terror: validated.error.issues.map((e) => e.message).join(\"; \"),\n\t\t});\n\t\treturn null;\n\t}\n\n\tconst cleanEnv =\n\t\tvalidated.data.env && typeof validated.data.env === \"object\"\n\t\t\t? (Object.fromEntries(\n\t\t\t\t\tObject.entries(validated.data.env).map(([k, v]) => [\n\t\t\t\t\t\tk,\n\t\t\t\t\t\tString(v ?? \"\"),\n\t\t\t\t\t]),\n\t\t\t\t) as Record<string, string>)\n\t\t\t: undefined;\n\tconst cleanHeaders =\n\t\tvalidated.data.headers && typeof validated.data.headers === \"object\"\n\t\t\t? (Object.fromEntries(\n\t\t\t\t\tObject.entries(validated.data.headers).map(([k, v]) => [\n\t\t\t\t\t\tk,\n\t\t\t\t\t\tString(v ?? \"\"),\n\t\t\t\t\t]),\n\t\t\t\t) as Record<string, string>)\n\t\t\t: undefined;\n\n\treturn {\n\t\t...validated.data,\n\t\tenv: cleanEnv,\n\t\theaders: cleanHeaders,\n\t\ttransport,\n\t\tscope,\n\t\tenabled: validated.data.enabled ?? validated.data.disabled !== true,\n\t\tsupportsParallelToolCalls:\n\t\t\tvalidated.data.supportsParallelToolCalls === true,\n\t};\n}\n\nfunction normalizeAuthPreset(\n\tpreset: McpAuthPresetInput,\n\tname: string,\n\tscope: McpScope,\n): McpAuthPresetConfig | null {\n\tconst expanded = expandAuthPresetEnv({ ...preset, name });\n\tconst validated = mcpAuthPresetSchema.safeParse(expanded);\n\tif (!validated.success) {\n\t\tlogger.warn(\"Invalid MCP auth preset entry\", {\n\t\t\tscope,\n\t\t\tname,\n\t\t\terror: validated.error.issues.map((e) => e.message).join(\"; \"),\n\t\t});\n\t\treturn null;\n\t}\n\n\tconst cleanHeaders =\n\t\tvalidated.data.headers && typeof validated.data.headers === \"object\"\n\t\t\t? (Object.fromEntries(\n\t\t\t\t\tObject.entries(validated.data.headers).map(([k, v]) => [\n\t\t\t\t\t\tk,\n\t\t\t\t\t\tString(v ?? \"\"),\n\t\t\t\t\t]),\n\t\t\t\t) as Record<string, string>)\n\t\t\t: undefined;\n\n\treturn {\n\t\t...validated.data,\n\t\theaders: cleanHeaders,\n\t\tscope,\n\t};\n}\n\nfunction resolveTransport(\n\tserver: McpServerInput,\n): McpServerConfig[\"transport\"] {\n\tif (\n\t\tserver.transport &&\n\t\t(server.transport === \"stdio\" ||\n\t\t\tserver.transport === \"http\" ||\n\t\t\tserver.transport === \"sse\")\n\t) {\n\t\treturn server.transport;\n\t}\n\tif (server.url) {\n\t\treturn isSseUrl(server.url) ? \"sse\" : \"http\";\n\t}\n\treturn \"stdio\";\n}\n\nfunction isSseUrl(rawUrl: string): boolean {\n\ttry {\n\t\tconst parsed = new URL(rawUrl);\n\t\tif (parsed.hostname.startsWith(\"sse.\")) return true;\n\t\tconst path = parsed.pathname || \"\";\n\t\tif (path.endsWith(\"/sse\")) return true;\n\t\tif (path.includes(\"/sse/\")) return true;\n\t\treturn false;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction buildPersistedServerConfig(\n\tserver: McpServerInput & { name: string },\n): PersistedMcpServerConfig {\n\treturn {\n\t\ttransport: server.transport,\n\t\tcommand: server.command,\n\t\targs: server.args,\n\t\tenv: server.env,\n\t\tcwd: server.cwd,\n\t\turl: server.url,\n\t\theaders: server.headers,\n\t\theadersHelper: server.headersHelper,\n\t\tauthPreset: server.authPreset,\n\t\ttimeout: server.timeout,\n\t\tenabled: server.enabled,\n\t\tdisabled: server.disabled,\n\t\tsupportsParallelToolCalls: server.supportsParallelToolCalls,\n\t};\n}\n\nfunction buildPersistedAuthPresetConfig(\n\tpreset: McpAuthPresetInput & { name: string },\n): PersistedMcpAuthPresetConfig {\n\treturn {\n\t\theaders: preset.headers,\n\t\theadersHelper: preset.headersHelper,\n\t};\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isWritableScope(\n\tvalue: McpScope | undefined,\n): value is WritableMcpScope {\n\treturn value === \"local\" || value === \"project\" || value === \"user\";\n}\n\nfunction expandValue(\n\tvalue: string | undefined,\n\tcontext: { kind: \"server\" | \"authPreset\"; name: string },\n): string | undefined {\n\tif (!value) return value;\n\treturn value.replace(/\\$\\{([^}]+)\\}/g, (_match, expr: unknown) => {\n\t\tconst [name, fallback] = String(expr).split(\":-\");\n\t\tconst val = name ? process.env[name] : undefined;\n\t\tif (val !== undefined) return val;\n\t\tif (fallback !== undefined) return fallback;\n\t\tlogger.debug(\"Missing environment variable during MCP expansion\", {\n\t\t\t[context.kind]: context.name,\n\t\t\tvariable: name,\n\t\t});\n\t\treturn _match;\n\t});\n}\n\nfunction expandServerEnv(\n\tserver: McpServerInput & {\n\t\ttransport: McpServerConfig[\"transport\"];\n\t\tname: string;\n\t},\n): McpServerInput {\n\tconst expand = (value?: string) =>\n\t\texpandValue(value, { kind: \"server\", name: server.name });\n\n\treturn {\n\t\t...server,\n\t\tcommand: expand(server.command),\n\t\targs: server.args\n\t\t\t? server.args.map((v) => expand(String(v)) ?? \"\")\n\t\t\t: undefined,\n\t\tenv: server.env\n\t\t\t? Object.fromEntries(\n\t\t\t\t\tObject.entries(server.env).map(([k, v]) => [\n\t\t\t\t\t\tk,\n\t\t\t\t\t\texpand(typeof v === \"string\" ? v : undefined) ?? \"\",\n\t\t\t\t\t]),\n\t\t\t\t)\n\t\t\t: undefined,\n\t\turl: expand(server.url),\n\t\theaders: server.headers\n\t\t\t? Object.fromEntries(\n\t\t\t\t\tObject.entries(server.headers).map(([k, v]) => {\n\t\t\t\t\t\tconst expanded =\n\t\t\t\t\t\t\texpand(typeof v === \"string\" ? v : undefined) ?? \"\";\n\t\t\t\t\t\treturn [k, expanded] as [string, string];\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t: undefined,\n\t\theadersHelper: expand(server.headersHelper),\n\t\tauthPreset: expand(server.authPreset),\n\t\tcwd: expand(server.cwd),\n\t};\n}\n\nfunction expandAuthPresetEnv(\n\tpreset: McpAuthPresetInput & { name: string },\n): McpAuthPresetInput {\n\tconst expand = (value?: string) =>\n\t\texpandValue(value, { kind: \"authPreset\", name: preset.name });\n\n\treturn {\n\t\t...preset,\n\t\theaders: preset.headers\n\t\t\t? Object.fromEntries(\n\t\t\t\t\tObject.entries(preset.headers).map(([k, v]) => {\n\t\t\t\t\t\tconst expanded =\n\t\t\t\t\t\t\texpand(typeof v === \"string\" ? v : undefined) ?? \"\";\n\t\t\t\t\t\treturn [k, expanded] as [string, string];\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t: undefined,\n\t\theadersHelper: expand(preset.headersHelper),\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MCP Configuration - Model Context Protocol Server Management\n *\n * This module handles loading and merging MCP (Model Context Protocol)\n * server configurations from multiple sources. MCP servers extend the\n * agent's capabilities with additional tools and integrations.\n *\n * ## Configuration Sources (precedence order)\n *\n * 1. **Enterprise**: `~/.maestro/enterprise/mcp.json` (highest; legacy\n * `.composer` enterprise MCP config remains a fallback)\n * 2. **Plugin**: Programmatically provided servers\n * 3. **Project**: `.maestro/mcp.json` in project root\n * 4. **Local**: `.maestro/mcp.local.json` (git-ignored)\n * 5. **User**: `~/.maestro/mcp.json` (lowest; legacy `.composer` user MCP config\n * remains a fallback)\n *\n * ## Configuration Format\n *\n * ```json\n * {\n * \"servers\": [\n * {\n * \"name\": \"my-server\",\n * \"transport\": \"stdio\",\n * \"command\": \"node\",\n * \"args\": [\"path/to/server.js\"],\n * \"env\": { \"API_KEY\": \"${MY_API_KEY}\" }\n * }\n * ],\n * \"mcpServers\": {\n * \"another-server\": {\n * \"command\": \"python\",\n * \"args\": [\"-m\", \"my_mcp_server\"]\n * }\n * }\n * }\n * ```\n *\n * ## Transport Types\n *\n * | Transport | Description |\n * |-----------|------------------------------------------|\n * | stdio | Communicate via stdin/stdout (default) |\n * | http | HTTP-based transport |\n * | sse | Server-Sent Events transport |\n *\n * ## Environment Variable Expansion\n *\n * Supports `${VAR}` and `${VAR:-default}` syntax in:\n * - command, args, url, cwd, headersHelper\n * - env values\n * - headers\n *\n * @module mcp/config\n */\n\nimport { readFileSync, statSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport type { z } from \"zod\";\nimport { PATHS } from \"../config/constants.js\";\nimport { readJsonFile, writeJsonFile } from \"../utils/fs.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { getHomeDir, resolveEnvPath } from \"../utils/path-expansion.js\";\nimport { uniquePaths } from \"../utils/path-utils.js\";\nimport { defaultEnvValidators, evaluateEnvValidators } from \"./env-limits.js\";\nimport { getFathomCuaPluginServers } from \"./fathom-cua.js\";\nimport { getPlatformMcpPluginServers } from \"./platform-plugin.js\";\nimport {\n\ttype McpAuthPresetInput,\n\ttype McpServerInput,\n\tmcpAuthPresetSchema,\n\tmcpConfigSchema,\n\tmcpServerSchema,\n\tmcpWorkspaceTrustDefaultSchema,\n\tmcpWorkspaceTrustEntrySchema,\n} from \"./schema.js\";\nimport type {\n\tMcpAuthPresetConfig,\n\tMcpConfig,\n\tMcpScope,\n\tMcpServerConfig,\n\tMcpWorkspaceTrustDefault,\n\tMcpWorkspaceTrustEntry,\n} from \"./types.js\";\n\nconst logger = createLogger(\"mcp:config\");\n\nconst PROJECT_CONFIG_NAME = \".maestro/mcp.json\";\nconst LOCAL_CONFIG_NAME = \".maestro/mcp.local.json\";\n\nconst getEnterpriseConfigPathOverride = (): string | null =>\n\tresolveEnvPath(process.env.MAESTRO_ENTERPRISE_MCP_PATH);\n\nconst getDefaultEnterpriseConfigPath = (): string =>\n\tjoin(PATHS.MAESTRO_HOME, \"enterprise\", \"mcp.json\");\n\nconst getEnterpriseConfigPath = (): string =>\n\tgetEnterpriseConfigPathOverride() ?? getDefaultEnterpriseConfigPath();\n\nconst getUserConfigPathOverride = (): string | null =>\n\tresolveEnvPath(process.env.MAESTRO_USER_MCP_PATH);\n\nconst getDefaultUserConfigPath = (): string =>\n\tjoin(PATHS.MAESTRO_HOME, \"mcp.json\");\n\nconst getUserConfigPath = (): string =>\n\tgetUserConfigPathOverride() ?? getDefaultUserConfigPath();\n\nconst getLegacyEnterpriseConfigPath = (): string =>\n\tjoin(getHomeDir(), \".composer\", \"enterprise\", \"mcp.json\");\n\nconst getLegacyUserConfigPath = (): string =>\n\tjoin(getHomeDir(), \".composer\", \"mcp.json\");\n\nfunction isConfigFile(path: string): boolean {\n\ttry {\n\t\treturn statSync(path).isFile();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction selectEffectiveConfigPath(paths: string[]): string {\n\treturn paths.find(isConfigFile) ?? paths[0]!;\n}\n\nconst getUserConfigPathCandidates = (): string[] => {\n\tconst overridePath = getUserConfigPathOverride();\n\tif (overridePath) {\n\t\treturn [overridePath];\n\t}\n\treturn uniquePaths([getDefaultUserConfigPath(), getLegacyUserConfigPath()]);\n};\n\nconst getEnterpriseConfigPathCandidates = (): string[] => {\n\tconst overridePath = getEnterpriseConfigPathOverride();\n\tif (overridePath) {\n\t\treturn [overridePath];\n\t}\n\treturn uniquePaths([\n\t\tgetDefaultEnterpriseConfigPath(),\n\t\tgetLegacyEnterpriseConfigPath(),\n\t]);\n};\n\nconst getEffectiveUserConfigPath = (): string =>\n\tselectEffectiveConfigPath(getUserConfigPathCandidates());\n\nconst getEffectiveEnterpriseConfigPath = (): string =>\n\tselectEffectiveConfigPath(getEnterpriseConfigPathCandidates());\n\ntype ParsedConfig = {\n\tservers: McpServerConfig[];\n\tauthPresets: McpAuthPresetConfig[];\n\ttrustedWorkspaces: Record<string, McpWorkspaceTrustEntry[]>;\n\tworkspaceTrustDefault?: McpWorkspaceTrustDefault;\n};\ntype RawMcpConfigFile = z.infer<typeof mcpConfigSchema>;\ntype PersistedMcpAuthPresetConfig = Omit<McpAuthPresetInput, \"name\">;\ntype PersistedMcpServerConfig = Omit<McpServerInput, \"name\">;\nexport type WritableMcpScope = Exclude<McpScope, \"enterprise\" | \"plugin\">;\n\nexport interface LoadMcpOptions {\n\tpluginServers?: McpServerConfig[];\n\tincludeEnvLimits?: boolean;\n}\n\nexport interface AddMcpServerOptions {\n\tprojectRoot?: string;\n\tscope: WritableMcpScope;\n\tserver: McpServerInput & { name: string };\n}\n\nexport interface AddMcpServersOptions {\n\tprojectRoot?: string;\n\tscope: WritableMcpScope;\n\tservers: Array<McpServerInput & { name: string }>;\n}\n\nexport interface AddMcpAuthPresetOptions {\n\tprojectRoot?: string;\n\tscope: WritableMcpScope;\n\tpreset: McpAuthPresetInput & { name: string };\n}\n\nexport interface RemoveMcpServerOptions {\n\tprojectRoot?: string;\n\tscope?: WritableMcpScope;\n\tname: string;\n}\n\nexport interface RemoveMcpAuthPresetOptions {\n\tprojectRoot?: string;\n\tscope?: WritableMcpScope;\n\tname: string;\n}\n\nexport interface UpdateMcpServerOptions {\n\tprojectRoot?: string;\n\tscope?: WritableMcpScope;\n\tname: string;\n\tserver: McpServerInput & { name: string };\n}\n\nexport interface UpdateMcpAuthPresetOptions {\n\tprojectRoot?: string;\n\tscope?: WritableMcpScope;\n\tname: string;\n\tpreset: McpAuthPresetInput & { name: string };\n}\n\nexport function loadMcpConfig(\n\tprojectRoot?: string,\n\toptions: LoadMcpOptions = {},\n): McpConfig {\n\tconst userCfg = parseConfigFile(getEffectiveUserConfigPath(), \"user\");\n\tconst enterpriseCfg = parseConfigFile(\n\t\tgetEffectiveEnterpriseConfigPath(),\n\t\t\"enterprise\",\n\t);\n\tconst projectCfg = projectRoot\n\t\t? parseConfigFile(resolve(projectRoot, PROJECT_CONFIG_NAME), \"project\")\n\t\t: { servers: [], authPresets: [], trustedWorkspaces: {} };\n\tconst localCfg = projectRoot\n\t\t? parseConfigFile(resolve(projectRoot, LOCAL_CONFIG_NAME), \"local\")\n\t\t: { servers: [], authPresets: [], trustedWorkspaces: {} };\n\tconst pluginCfg: ParsedConfig = {\n\t\tservers: [\n\t\t\t...getPlatformMcpPluginServers(),\n\t\t\t...getFathomCuaPluginServers(),\n\t\t\t...(options.pluginServers ?? []),\n\t\t],\n\t\tauthPresets: [],\n\t\ttrustedWorkspaces: {},\n\t};\n\n\tconst merged = new Map<string, McpServerConfig>();\n\tconst mergedAuthPresets = new Map<string, McpAuthPresetConfig>();\n\tconst mergedTrustedWorkspaces: Record<string, McpWorkspaceTrustEntry[]> = {};\n\tlet workspaceTrustDefault: McpWorkspaceTrustDefault | undefined;\n\t// precedence: enterprise -> plugin -> project -> local -> user\n\t// lower precedence first, higher precedence last so later overrides earlier\n\tfor (const src of [userCfg, localCfg, projectCfg, pluginCfg, enterpriseCfg]) {\n\t\tfor (const authPreset of src.authPresets) {\n\t\t\tmergedAuthPresets.set(authPreset.name, authPreset);\n\t\t}\n\t\tfor (const server of src.servers) {\n\t\t\t// A higher-precedence config can explicitly disable a server defined earlier.\n\t\t\tif (server.enabled === false || server.disabled === true) {\n\t\t\t\tmerged.delete(server.name);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmerged.set(server.name, server);\n\t\t}\n\t\tfor (const [serverName, entries] of Object.entries(src.trustedWorkspaces)) {\n\t\t\tmergedTrustedWorkspaces[serverName] = [\n\t\t\t\t...(mergedTrustedWorkspaces[serverName] ?? []),\n\t\t\t\t...entries,\n\t\t\t];\n\t\t}\n\t\tif (src.workspaceTrustDefault) {\n\t\t\tworkspaceTrustDefault = src.workspaceTrustDefault;\n\t\t}\n\t}\n\n\tconst envLimits = options.includeEnvLimits\n\t\t? evaluateEnvValidators(defaultEnvValidators)\n\t\t: undefined;\n\n\treturn {\n\t\tservers: Array.from(merged.values()),\n\t\tauthPresets: Array.from(mergedAuthPresets.values()),\n\t\tprojectRoot: projectRoot ? resolve(projectRoot) : undefined,\n\t\ttrustedWorkspaces:\n\t\t\tObject.keys(mergedTrustedWorkspaces).length > 0\n\t\t\t\t? mergedTrustedWorkspaces\n\t\t\t\t: undefined,\n\t\tworkspaceTrustDefault,\n\t\tenvLimits,\n\t};\n}\n\nexport function getConfigPaths(projectRoot?: string): string[] {\n\tconst paths = [\n\t\tgetEffectiveUserConfigPath(),\n\t\tgetEffectiveEnterpriseConfigPath(),\n\t];\n\tif (projectRoot) {\n\t\tpaths.push(resolve(projectRoot, PROJECT_CONFIG_NAME));\n\t\tpaths.push(resolve(projectRoot, LOCAL_CONFIG_NAME));\n\t}\n\treturn paths;\n}\n\nexport function getWritableMcpConfigPath(\n\tscope: WritableMcpScope,\n\tprojectRoot = process.cwd(),\n): string {\n\tswitch (scope) {\n\t\tcase \"user\":\n\t\t\treturn getEffectiveUserConfigPath();\n\t\tcase \"project\":\n\t\t\treturn resolve(projectRoot, PROJECT_CONFIG_NAME);\n\t\tcase \"local\":\n\t\t\treturn resolve(projectRoot, LOCAL_CONFIG_NAME);\n\t}\n}\n\nexport function inferRemoteMcpTransport(url: string): \"http\" | \"sse\" {\n\treturn isSseUrl(url) ? \"sse\" : \"http\";\n}\n\nexport function addMcpServerToConfig(options: AddMcpServerOptions): {\n\tpath: string;\n} {\n\treturn addMcpServersToConfig({\n\t\tprojectRoot: options.projectRoot,\n\t\tscope: options.scope,\n\t\tservers: [options.server],\n\t});\n}\n\nexport function validateMcpServersForConfig(options: AddMcpServersOptions): {\n\tpath: string;\n} {\n\tconst { path } = prepareMcpServersConfigUpdate(options);\n\treturn { path };\n}\n\nexport function addMcpServersToConfig(options: AddMcpServersOptions): {\n\tpath: string;\n} {\n\tconst { path, nextConfig } = prepareMcpServersConfigUpdate(options);\n\twriteJsonFile(path, nextConfig);\n\treturn { path };\n}\n\nfunction prepareMcpServersConfigUpdate(options: AddMcpServersOptions): {\n\tpath: string;\n\tnextConfig: RawMcpConfigFile;\n} {\n\tconst path = getWritableMcpConfigPath(options.scope, options.projectRoot);\n\tconst validatedServers = options.servers.map((server) =>\n\t\tmcpServerSchema.parse({\n\t\t\t...server,\n\t\t\ttransport:\n\t\t\t\tserver.transport ??\n\t\t\t\t(server.url ? inferRemoteMcpTransport(server.url) : \"stdio\"),\n\t\t}),\n\t);\n\tconst seenNames = new Set<string>();\n\tfor (const server of validatedServers) {\n\t\tif (seenNames.has(server.name)) {\n\t\t\tthrow new Error(`MCP server \"${server.name}\" is listed more than once`);\n\t\t}\n\t\tseenNames.add(server.name);\n\t}\n\tconst existing = readJsonFile<unknown>(path, { fallback: {} });\n\tconst parsed = mcpConfigSchema.safeParse(existing);\n\tif (!parsed.success) {\n\t\tthrow new Error(\n\t\t\t`Invalid MCP config at ${path}: ${parsed.error.issues.map((issue) => issue.message).join(\"; \")}`,\n\t\t);\n\t}\n\n\tconst nextConfig = structuredClone(parsed.data) as RawMcpConfigFile;\n\tconst hasObjectFormat =\n\t\tisRecord(nextConfig.mcpServers) || !Array.isArray(nextConfig.servers);\n\tif (hasObjectFormat) {\n\t\tconst existingServers = isRecord(nextConfig.mcpServers)\n\t\t\t? nextConfig.mcpServers\n\t\t\t: {};\n\t\tconst nextServers = { ...existingServers };\n\t\tfor (const server of validatedServers) {\n\t\t\tif (Object.prototype.hasOwnProperty.call(nextServers, server.name)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`MCP server \"${server.name}\" already exists in ${path}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tnextServers[server.name] = buildPersistedServerConfig(server);\n\t\t}\n\t\tnextConfig.mcpServers = nextServers;\n\t} else {\n\t\tconst servers = nextConfig.servers ?? [];\n\t\tconst existingNames = new Set(servers.map((server) => server.name));\n\t\tconst nextServers = [...servers];\n\t\tfor (const server of validatedServers) {\n\t\t\tif (existingNames.has(server.name)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`MCP server \"${server.name}\" already exists in ${path}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\texistingNames.add(server.name);\n\t\t\tnextServers.push({\n\t\t\t\t...buildPersistedServerConfig(server),\n\t\t\t\tname: server.name,\n\t\t\t});\n\t\t}\n\t\tnextConfig.servers = nextServers;\n\t}\n\treturn { path, nextConfig };\n}\n\nexport function addMcpAuthPresetToConfig(options: AddMcpAuthPresetOptions): {\n\tpath: string;\n} {\n\tconst path = getWritableMcpConfigPath(options.scope, options.projectRoot);\n\tconst validatedPreset = mcpAuthPresetSchema.parse(options.preset);\n\tconst existing = readJsonFile<unknown>(path, { fallback: {} });\n\tconst parsed = mcpConfigSchema.safeParse(existing);\n\tif (!parsed.success) {\n\t\tthrow new Error(\n\t\t\t`Invalid MCP config at ${path}: ${parsed.error.issues.map((issue) => issue.message).join(\"; \")}`,\n\t\t);\n\t}\n\n\tconst nextConfig = structuredClone(parsed.data) as RawMcpConfigFile;\n\tconst existingPresets = isRecord(nextConfig.authPresets)\n\t\t? nextConfig.authPresets\n\t\t: {};\n\tif (\n\t\tObject.prototype.hasOwnProperty.call(existingPresets, validatedPreset.name)\n\t) {\n\t\tthrow new Error(\n\t\t\t`MCP auth preset \"${validatedPreset.name}\" already exists in ${path}`,\n\t\t);\n\t}\n\n\tnextConfig.authPresets = {\n\t\t...existingPresets,\n\t\t[validatedPreset.name]: buildPersistedAuthPresetConfig(validatedPreset),\n\t};\n\n\twriteJsonFile(path, nextConfig);\n\treturn { path };\n}\n\nexport function removeMcpServerFromConfig(options: RemoveMcpServerOptions): {\n\tpath: string;\n\tscope: WritableMcpScope;\n} {\n\tconst projectRoot = options.projectRoot ?? process.cwd();\n\tconst scope = resolveWritableMutationScope(\n\t\toptions.name,\n\t\toptions.scope,\n\t\tprojectRoot,\n\t);\n\tconst { path, config } = readWritableMcpConfig(scope, projectRoot);\n\tconst nextConfig = structuredClone(config) as RawMcpConfigFile;\n\tconst removed = mutateWritableMcpConfig(nextConfig, options.name, \"remove\");\n\tif (!removed) {\n\t\tthrow new Error(`MCP server \"${options.name}\" not found in ${path}`);\n\t}\n\n\twriteJsonFile(path, nextConfig);\n\treturn { path, scope };\n}\n\nexport function removeMcpAuthPresetFromConfig(\n\toptions: RemoveMcpAuthPresetOptions,\n): {\n\tpath: string;\n\tscope: WritableMcpScope;\n} {\n\tconst projectRoot = options.projectRoot ?? process.cwd();\n\tconst scope = resolveWritableAuthPresetMutationScope(\n\t\toptions.name,\n\t\toptions.scope,\n\t\tprojectRoot,\n\t);\n\tconst { path, config } = readWritableMcpConfig(scope, projectRoot);\n\tconst nextConfig = structuredClone(config) as RawMcpConfigFile;\n\tconst removed = mutateWritableMcpAuthPresetConfig(\n\t\tnextConfig,\n\t\toptions.name,\n\t\t\"remove\",\n\t);\n\tif (!removed) {\n\t\tthrow new Error(`MCP auth preset \"${options.name}\" not found in ${path}`);\n\t}\n\n\twriteJsonFile(path, nextConfig);\n\treturn { path, scope };\n}\n\nexport function updateMcpServerInConfig(options: UpdateMcpServerOptions): {\n\tpath: string;\n\tscope: WritableMcpScope;\n} {\n\tconst projectRoot = options.projectRoot ?? process.cwd();\n\tconst scope = resolveWritableMutationScope(\n\t\toptions.name,\n\t\toptions.scope,\n\t\tprojectRoot,\n\t);\n\tif (options.server.name !== options.name) {\n\t\tthrow new Error(\"Renaming MCP servers is not supported by /mcp edit.\");\n\t}\n\n\tconst validatedServer = mcpServerSchema.parse({\n\t\t...options.server,\n\t\ttransport:\n\t\t\toptions.server.transport ??\n\t\t\t(options.server.url\n\t\t\t\t? inferRemoteMcpTransport(options.server.url)\n\t\t\t\t: \"stdio\"),\n\t});\n\tconst { path, config } = readWritableMcpConfig(scope, projectRoot);\n\tconst nextConfig = structuredClone(config) as RawMcpConfigFile;\n\tconst updated = mutateWritableMcpConfig(nextConfig, options.name, \"update\", {\n\t\tserver: validatedServer,\n\t});\n\tif (!updated) {\n\t\tthrow new Error(`MCP server \"${options.name}\" not found in ${path}`);\n\t}\n\n\twriteJsonFile(path, nextConfig);\n\treturn { path, scope };\n}\n\nexport function updateMcpAuthPresetInConfig(\n\toptions: UpdateMcpAuthPresetOptions,\n): {\n\tpath: string;\n\tscope: WritableMcpScope;\n} {\n\tconst projectRoot = options.projectRoot ?? process.cwd();\n\tconst scope = resolveWritableAuthPresetMutationScope(\n\t\toptions.name,\n\t\toptions.scope,\n\t\tprojectRoot,\n\t);\n\tif (options.preset.name !== options.name) {\n\t\tthrow new Error(\"Renaming MCP auth presets is not supported.\");\n\t}\n\n\tconst validatedPreset = mcpAuthPresetSchema.parse(options.preset);\n\tconst { path, config } = readWritableMcpConfig(scope, projectRoot);\n\tconst nextConfig = structuredClone(config) as RawMcpConfigFile;\n\tconst updated = mutateWritableMcpAuthPresetConfig(\n\t\tnextConfig,\n\t\toptions.name,\n\t\t\"update\",\n\t\t{\n\t\t\tpreset: validatedPreset,\n\t\t},\n\t);\n\tif (!updated) {\n\t\tthrow new Error(`MCP auth preset \"${options.name}\" not found in ${path}`);\n\t}\n\n\twriteJsonFile(path, nextConfig);\n\treturn { path, scope };\n}\n\nfunction parseConfigFile(path: string, scope: McpScope): ParsedConfig {\n\tif (!isConfigFile(path)) {\n\t\treturn { servers: [], authPresets: [], trustedWorkspaces: {} };\n\t}\n\ttry {\n\t\tconst content = readFileSync(path, \"utf-8\");\n\t\tconst json = JSON.parse(content);\n\t\tconst parsed = mcpConfigSchema.safeParse(json);\n\t\tif (!parsed.success) {\n\t\t\tlogger.warn(\"Invalid MCP config\", {\n\t\t\t\tscope,\n\t\t\t\tpath,\n\t\t\t\terror: parsed.error.issues.map((e) => e.message).join(\"; \"),\n\t\t\t});\n\t\t\treturn { servers: [], authPresets: [], trustedWorkspaces: {} };\n\t\t}\n\n\t\tconst servers: McpServerConfig[] = [];\n\t\tconst authPresets: McpAuthPresetConfig[] = [];\n\t\tif (Array.isArray(parsed.data.servers)) {\n\t\t\tfor (const server of parsed.data.servers) {\n\t\t\t\tconst normalized = normalizeServer(server, server.name, scope);\n\t\t\t\tif (normalized) servers.push(normalized);\n\t\t\t}\n\t\t}\n\t\tif (parsed.data.mcpServers) {\n\t\t\tfor (const [name, raw] of Object.entries(parsed.data.mcpServers)) {\n\t\t\t\tconst merged: McpServerInput | { name: string } = isRecord(raw)\n\t\t\t\t\t? ({ ...raw, name } as McpServerInput)\n\t\t\t\t\t: { name };\n\t\t\t\tconst normalized = normalizeServer(merged, name, scope);\n\t\t\t\tif (normalized) servers.push(normalized);\n\t\t\t}\n\t\t}\n\t\tif (parsed.data.authPresets) {\n\t\t\tfor (const [name, raw] of Object.entries(parsed.data.authPresets)) {\n\t\t\t\tconst merged: McpAuthPresetInput | { name: string } = isRecord(raw)\n\t\t\t\t\t? ({ ...raw, name } as McpAuthPresetInput)\n\t\t\t\t\t: { name };\n\t\t\t\tconst normalized = normalizeAuthPreset(merged, name, scope);\n\t\t\t\tif (normalized) authPresets.push(normalized);\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tservers,\n\t\t\tauthPresets,\n\t\t\ttrustedWorkspaces: normalizeTrustedWorkspaces(\n\t\t\t\tparsed.data.trustedWorkspaces,\n\t\t\t\tscope,\n\t\t\t\tpath,\n\t\t\t),\n\t\t\tworkspaceTrustDefault: normalizeWorkspaceTrustDefault(\n\t\t\t\tparsed.data.workspaceTrustDefault,\n\t\t\t\tscope,\n\t\t\t\tpath,\n\t\t\t),\n\t\t};\n\t} catch (error) {\n\t\tlogger.warn(\"Failed to parse MCP config file\", {\n\t\t\tpath,\n\t\t\tscope,\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\tstack: error instanceof Error ? error.stack : undefined,\n\t\t});\n\t\treturn { servers: [], authPresets: [], trustedWorkspaces: {} };\n\t}\n}\n\nfunction normalizeWorkspaceTrustDefault(\n\traw: unknown,\n\tscope: McpScope,\n\tpath: string,\n): McpWorkspaceTrustDefault | undefined {\n\tif (raw === undefined) {\n\t\treturn undefined;\n\t}\n\tconst parsed = mcpWorkspaceTrustDefaultSchema.safeParse(raw);\n\tif (parsed.success) {\n\t\treturn parsed.data;\n\t}\n\tlogger.warn(\"Invalid MCP workspaceTrustDefault\", {\n\t\tscope,\n\t\tpath,\n\t\terror: parsed.error.issues.map((issue) => issue.message).join(\"; \"),\n\t});\n\treturn undefined;\n}\n\nfunction normalizeTrustedWorkspaces(\n\traw: unknown,\n\tscope: McpScope,\n\tpath: string,\n): Record<string, McpWorkspaceTrustEntry[]> {\n\tif (raw === undefined) {\n\t\treturn {};\n\t}\n\tif (!isRecord(raw)) {\n\t\tlogger.warn(\"Invalid MCP trustedWorkspaces\", {\n\t\t\tscope,\n\t\t\tpath,\n\t\t\terror: \"expected an object keyed by MCP server name\",\n\t\t});\n\t\treturn {};\n\t}\n\tconst trustedWorkspaces: Record<string, McpWorkspaceTrustEntry[]> = {};\n\tfor (const [serverName, entries] of Object.entries(raw)) {\n\t\tif (!Array.isArray(entries)) {\n\t\t\tlogger.warn(\"Invalid MCP trustedWorkspaces entry\", {\n\t\t\t\tscope,\n\t\t\t\tpath,\n\t\t\t\tserverName,\n\t\t\t\terror: \"expected an array of workspace trust entries\",\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tconst validEntries: McpWorkspaceTrustEntry[] = [];\n\t\tfor (const [index, entry] of entries.entries()) {\n\t\t\tconst parsed = mcpWorkspaceTrustEntrySchema.safeParse(entry);\n\t\t\tif (!parsed.success) {\n\t\t\t\tlogger.warn(\"Invalid MCP trusted workspace entry\", {\n\t\t\t\t\tscope,\n\t\t\t\t\tpath,\n\t\t\t\t\tserverName,\n\t\t\t\t\tindex,\n\t\t\t\t\terror: parsed.error.issues.map((issue) => issue.message).join(\"; \"),\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvalidEntries.push(parsed.data);\n\t\t}\n\t\tif (validEntries.length > 0) {\n\t\t\ttrustedWorkspaces[serverName] = validEntries;\n\t\t}\n\t}\n\treturn trustedWorkspaces;\n}\n\nfunction readWritableMcpConfig(\n\tscope: WritableMcpScope,\n\tprojectRoot: string,\n): {\n\tpath: string;\n\tconfig: RawMcpConfigFile;\n} {\n\tconst path = getWritableMcpConfigPath(scope, projectRoot);\n\tconst existing = readJsonFile<unknown>(path, { fallback: {} });\n\tconst parsed = mcpConfigSchema.safeParse(existing);\n\tif (!parsed.success) {\n\t\tthrow new Error(\n\t\t\t`Invalid MCP config at ${path}: ${parsed.error.issues.map((issue) => issue.message).join(\"; \")}`,\n\t\t);\n\t}\n\treturn { path, config: parsed.data };\n}\n\nfunction resolveWritableMutationScope(\n\tname: string,\n\tscope: WritableMcpScope | undefined,\n\tprojectRoot: string,\n): WritableMcpScope {\n\tif (scope) {\n\t\treturn scope;\n\t}\n\n\tconst activeServer = loadMcpConfig(projectRoot).servers.find(\n\t\t(server) => server.name === name,\n\t);\n\tif (!activeServer) {\n\t\tthrow new Error(`MCP server \"${name}\" not found in merged config.`);\n\t}\n\tif (!isWritableScope(activeServer.scope)) {\n\t\tthrow new Error(\n\t\t\t`MCP server \"${name}\" is managed by ${activeServer.scope ?? \"an unknown\"} scope and cannot be edited here.`,\n\t\t);\n\t}\n\treturn activeServer.scope;\n}\n\nfunction resolveWritableAuthPresetMutationScope(\n\tname: string,\n\tscope: WritableMcpScope | undefined,\n\tprojectRoot: string,\n): WritableMcpScope {\n\tif (scope) {\n\t\treturn scope;\n\t}\n\n\tconst activePreset = loadMcpConfig(projectRoot).authPresets.find(\n\t\t(preset) => preset.name === name,\n\t);\n\tif (!activePreset) {\n\t\tthrow new Error(`MCP auth preset \"${name}\" not found in merged config.`);\n\t}\n\tif (!isWritableScope(activePreset.scope)) {\n\t\tthrow new Error(\n\t\t\t`MCP auth preset \"${name}\" is managed by ${activePreset.scope ?? \"an unknown\"} scope and cannot be edited here.`,\n\t\t);\n\t}\n\treturn activePreset.scope;\n}\n\nfunction mutateWritableMcpConfig(\n\tconfig: RawMcpConfigFile,\n\tname: string,\n\tmode: \"remove\" | \"update\",\n\toptions?: { server: McpServerInput & { name: string } },\n): boolean {\n\tif (\n\t\tisRecord(config.mcpServers) &&\n\t\tObject.prototype.hasOwnProperty.call(config.mcpServers, name)\n\t) {\n\t\tif (mode === \"remove\") {\n\t\t\tdelete config.mcpServers[name];\n\t\t} else {\n\t\t\tconfig.mcpServers[name] = buildPersistedServerConfig(options!.server);\n\t\t}\n\t\treturn true;\n\t}\n\n\tif (Array.isArray(config.servers)) {\n\t\tconst index = config.servers.findIndex((server) => server.name === name);\n\t\tif (index >= 0) {\n\t\t\tif (mode === \"remove\") {\n\t\t\t\tconfig.servers.splice(index, 1);\n\t\t\t} else {\n\t\t\t\tconfig.servers[index] = {\n\t\t\t\t\t...buildPersistedServerConfig(options!.server),\n\t\t\t\t\tname: options!.server.name,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nfunction mutateWritableMcpAuthPresetConfig(\n\tconfig: RawMcpConfigFile,\n\tname: string,\n\tmode: \"remove\" | \"update\",\n\toptions?: {\n\t\tpreset: McpAuthPresetInput & { name: string };\n\t},\n): boolean {\n\tif (\n\t\tisRecord(config.authPresets) &&\n\t\tObject.prototype.hasOwnProperty.call(config.authPresets, name)\n\t) {\n\t\tif (mode === \"remove\") {\n\t\t\tdelete config.authPresets[name];\n\t\t} else {\n\t\t\tconfig.authPresets[name] = buildPersistedAuthPresetConfig(\n\t\t\t\toptions!.preset,\n\t\t\t);\n\t\t}\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nfunction normalizeServer(\n\tserver: McpServerInput,\n\tname: string,\n\tscope: McpScope,\n): McpServerConfig | null {\n\tconst transport = resolveTransport(server);\n\tconst expanded = expandServerEnv({ ...server, name, transport });\n\n\tconst validated = mcpServerSchema.safeParse(expanded);\n\tif (!validated.success) {\n\t\tlogger.warn(\"Invalid MCP server entry\", {\n\t\t\tscope,\n\t\t\tname,\n\t\t\terror: validated.error.issues.map((e) => e.message).join(\"; \"),\n\t\t});\n\t\treturn null;\n\t}\n\n\tconst cleanEnv =\n\t\tvalidated.data.env && typeof validated.data.env === \"object\"\n\t\t\t? (Object.fromEntries(\n\t\t\t\t\tObject.entries(validated.data.env).map(([k, v]) => [\n\t\t\t\t\t\tk,\n\t\t\t\t\t\tString(v ?? \"\"),\n\t\t\t\t\t]),\n\t\t\t\t) as Record<string, string>)\n\t\t\t: undefined;\n\tconst cleanHeaders =\n\t\tvalidated.data.headers && typeof validated.data.headers === \"object\"\n\t\t\t? (Object.fromEntries(\n\t\t\t\t\tObject.entries(validated.data.headers).map(([k, v]) => [\n\t\t\t\t\t\tk,\n\t\t\t\t\t\tString(v ?? \"\"),\n\t\t\t\t\t]),\n\t\t\t\t) as Record<string, string>)\n\t\t\t: undefined;\n\n\treturn {\n\t\t...validated.data,\n\t\tenv: cleanEnv,\n\t\theaders: cleanHeaders,\n\t\ttransport,\n\t\tscope,\n\t\tenabled: validated.data.enabled ?? validated.data.disabled !== true,\n\t\tsupportsParallelToolCalls:\n\t\t\tvalidated.data.supportsParallelToolCalls === true,\n\t};\n}\n\nfunction normalizeAuthPreset(\n\tpreset: McpAuthPresetInput,\n\tname: string,\n\tscope: McpScope,\n): McpAuthPresetConfig | null {\n\tconst expanded = expandAuthPresetEnv({ ...preset, name });\n\tconst validated = mcpAuthPresetSchema.safeParse(expanded);\n\tif (!validated.success) {\n\t\tlogger.warn(\"Invalid MCP auth preset entry\", {\n\t\t\tscope,\n\t\t\tname,\n\t\t\terror: validated.error.issues.map((e) => e.message).join(\"; \"),\n\t\t});\n\t\treturn null;\n\t}\n\n\tconst cleanHeaders =\n\t\tvalidated.data.headers && typeof validated.data.headers === \"object\"\n\t\t\t? (Object.fromEntries(\n\t\t\t\t\tObject.entries(validated.data.headers).map(([k, v]) => [\n\t\t\t\t\t\tk,\n\t\t\t\t\t\tString(v ?? \"\"),\n\t\t\t\t\t]),\n\t\t\t\t) as Record<string, string>)\n\t\t\t: undefined;\n\n\treturn {\n\t\t...validated.data,\n\t\theaders: cleanHeaders,\n\t\tscope,\n\t};\n}\n\nfunction resolveTransport(\n\tserver: McpServerInput,\n): McpServerConfig[\"transport\"] {\n\tif (\n\t\tserver.transport &&\n\t\t(server.transport === \"stdio\" ||\n\t\t\tserver.transport === \"http\" ||\n\t\t\tserver.transport === \"sse\")\n\t) {\n\t\treturn server.transport;\n\t}\n\tif (server.url) {\n\t\treturn isSseUrl(server.url) ? \"sse\" : \"http\";\n\t}\n\treturn \"stdio\";\n}\n\nfunction isSseUrl(rawUrl: string): boolean {\n\ttry {\n\t\tconst parsed = new URL(rawUrl);\n\t\tif (parsed.hostname.startsWith(\"sse.\")) return true;\n\t\tconst path = parsed.pathname || \"\";\n\t\tif (path.endsWith(\"/sse\")) return true;\n\t\tif (path.includes(\"/sse/\")) return true;\n\t\treturn false;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction buildPersistedServerConfig(\n\tserver: McpServerInput & { name: string },\n): PersistedMcpServerConfig {\n\treturn {\n\t\ttransport: server.transport,\n\t\tcommand: server.command,\n\t\targs: server.args,\n\t\tenv: server.env,\n\t\tcwd: server.cwd,\n\t\turl: server.url,\n\t\theaders: server.headers,\n\t\theadersHelper: server.headersHelper,\n\t\tauthPreset: server.authPreset,\n\t\ttimeout: server.timeout,\n\t\tenabled: server.enabled,\n\t\tdisabled: server.disabled,\n\t\tsupportsParallelToolCalls: server.supportsParallelToolCalls,\n\t};\n}\n\nfunction buildPersistedAuthPresetConfig(\n\tpreset: McpAuthPresetInput & { name: string },\n): PersistedMcpAuthPresetConfig {\n\treturn {\n\t\theaders: preset.headers,\n\t\theadersHelper: preset.headersHelper,\n\t};\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isWritableScope(\n\tvalue: McpScope | undefined,\n): value is WritableMcpScope {\n\treturn value === \"local\" || value === \"project\" || value === \"user\";\n}\n\nfunction expandValue(\n\tvalue: string | undefined,\n\tcontext: { kind: \"server\" | \"authPreset\"; name: string },\n): string | undefined {\n\tif (!value) return value;\n\treturn value.replace(/\\$\\{([^}]+)\\}/g, (_match, expr: unknown) => {\n\t\tconst [name, fallback] = String(expr).split(\":-\");\n\t\tconst val = name ? process.env[name] : undefined;\n\t\tif (val !== undefined) return val;\n\t\tif (fallback !== undefined) return fallback;\n\t\tlogger.debug(\"Missing environment variable during MCP expansion\", {\n\t\t\t[context.kind]: context.name,\n\t\t\tvariable: name,\n\t\t});\n\t\treturn _match;\n\t});\n}\n\nfunction expandServerEnv(\n\tserver: McpServerInput & {\n\t\ttransport: McpServerConfig[\"transport\"];\n\t\tname: string;\n\t},\n): McpServerInput {\n\tconst expand = (value?: string) =>\n\t\texpandValue(value, { kind: \"server\", name: server.name });\n\n\treturn {\n\t\t...server,\n\t\tcommand: expand(server.command),\n\t\targs: server.args\n\t\t\t? server.args.map((v) => expand(String(v)) ?? \"\")\n\t\t\t: undefined,\n\t\tenv: server.env\n\t\t\t? Object.fromEntries(\n\t\t\t\t\tObject.entries(server.env).map(([k, v]) => [\n\t\t\t\t\t\tk,\n\t\t\t\t\t\texpand(typeof v === \"string\" ? v : undefined) ?? \"\",\n\t\t\t\t\t]),\n\t\t\t\t)\n\t\t\t: undefined,\n\t\turl: expand(server.url),\n\t\theaders: server.headers\n\t\t\t? Object.fromEntries(\n\t\t\t\t\tObject.entries(server.headers).map(([k, v]) => {\n\t\t\t\t\t\tconst expanded =\n\t\t\t\t\t\t\texpand(typeof v === \"string\" ? v : undefined) ?? \"\";\n\t\t\t\t\t\treturn [k, expanded] as [string, string];\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t: undefined,\n\t\theadersHelper: expand(server.headersHelper),\n\t\tauthPreset: expand(server.authPreset),\n\t\tcwd: expand(server.cwd),\n\t};\n}\n\nfunction expandAuthPresetEnv(\n\tpreset: McpAuthPresetInput & { name: string },\n): McpAuthPresetInput {\n\tconst expand = (value?: string) =>\n\t\texpandValue(value, { kind: \"authPreset\", name: preset.name });\n\n\treturn {\n\t\t...preset,\n\t\theaders: preset.headers\n\t\t\t? Object.fromEntries(\n\t\t\t\t\tObject.entries(preset.headers).map(([k, v]) => {\n\t\t\t\t\t\tconst expanded =\n\t\t\t\t\t\t\texpand(typeof v === \"string\" ? v : undefined) ?? \"\";\n\t\t\t\t\t\treturn [k, expanded] as [string, string];\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t: undefined,\n\t\theadersHelper: expand(preset.headersHelper),\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fathom-cua.d.ts","sourceRoot":"","sources":["../../src/mcp/fathom-cua.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"fathom-cua.d.ts","sourceRoot":"","sources":["../../src/mcp/fathom-cua.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAmLlD,wBAAgB,yBAAyB,IAAI,eAAe,EAAE,CAK7D"}
|
package/dist/mcp/fathom-cua.js
CHANGED
|
@@ -53,7 +53,12 @@ const DISABLE_IPC_ENV_VARS = [
|
|
|
53
53
|
"MAESTRO_FATHOM_CUA_DISABLE_IPC",
|
|
54
54
|
"FATHOM_CUA_DISABLE_IPC",
|
|
55
55
|
];
|
|
56
|
+
const TOOL_PROFILE_ENV_VARS = [
|
|
57
|
+
"MAESTRO_FATHOM_CUA_TOOL_PROFILE",
|
|
58
|
+
"FATHOM_CUA_TOOL_PROFILE",
|
|
59
|
+
];
|
|
56
60
|
const DEFAULT_SERVER_NAME = "fathom-cua";
|
|
61
|
+
const DEFAULT_TOOL_PROFILE = "canonical";
|
|
57
62
|
function envFlagEnabled(names) {
|
|
58
63
|
const value = getEnvValue(names);
|
|
59
64
|
if (!value) {
|
|
@@ -96,6 +101,9 @@ function appendFlag(args, flag, value) {
|
|
|
96
101
|
args.push(flag, value);
|
|
97
102
|
}
|
|
98
103
|
}
|
|
104
|
+
function resolveToolProfile() {
|
|
105
|
+
return getEnvValue(TOOL_PROFILE_ENV_VARS)?.trim() || DEFAULT_TOOL_PROFILE;
|
|
106
|
+
}
|
|
99
107
|
function resolveFathomRepo() {
|
|
100
108
|
const configured = getEnvValue(REPO_ENV_VARS);
|
|
101
109
|
if (configured) {
|
|
@@ -125,6 +133,8 @@ function buildFathomCuaServer() {
|
|
|
125
133
|
const ipcRoot = getEnvValue(IPC_ROOT_ENV_VARS);
|
|
126
134
|
const sessionId = getEnvValue(SESSION_ID_ENV_VARS);
|
|
127
135
|
const turnId = getEnvValue(TURN_ID_ENV_VARS);
|
|
136
|
+
const toolProfile = resolveToolProfile();
|
|
137
|
+
appendFlag(args, "-tool-profile", toolProfile);
|
|
128
138
|
appendFlag(args, "-workspace-id", workspaceId);
|
|
129
139
|
appendFlag(args, "-helper-endpoint", helperEndpoint);
|
|
130
140
|
appendFlag(args, "-ipc-root", ipcRoot);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fathom-cua.js","sourceRoot":"","sources":["../../src/mcp/fathom-cua.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,MAAM,MAAM,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;AAE9C,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AAC7D,MAAM,gBAAgB,GAAG;IACxB,4BAA4B;IAC5B,wBAAwB;CACf,CAAC;AACX,MAAM,aAAa,GAAG,CAAC,6BAA6B,EAAE,qBAAqB,CAAC,CAAC;AAC7E,MAAM,gBAAgB,GAAG;IACxB,mCAAmC;IACnC,2BAA2B;CAClB,CAAC;AACX,MAAM,aAAa,GAAG;IACrB,qCAAqC;IACrC,6BAA6B;CACpB,CAAC;AACX,MAAM,aAAa,GAAG,CAAC,yBAAyB,EAAE,iBAAiB,CAAU,CAAC;AAC9E,MAAM,YAAY,GAAG;IACpB,+BAA+B;IAC/B,uBAAuB;CACd,CAAC;AACX,MAAM,kBAAkB,GAAG;IAC1B,iCAAiC;IACjC,yBAAyB;IACzB,sBAAsB;IACtB,8BAA8B;IAC9B,sBAAsB;CACb,CAAC;AACX,MAAM,wBAAwB,GAAG;IAChC,oCAAoC;IACpC,4BAA4B;CACnB,CAAC;AACX,MAAM,iBAAiB,GAAG;IACzB,6BAA6B;IAC7B,qBAAqB;IACrB,iBAAiB;CACR,CAAC;AACX,MAAM,mBAAmB,GAAG;IAC3B,+BAA+B;IAC/B,uBAAuB;IACvB,oBAAoB;CACX,CAAC;AACX,MAAM,gBAAgB,GAAG;IACxB,4BAA4B;IAC5B,oBAAoB;IACpB,sBAAsB;IACtB,oBAAoB;CACX,CAAC;AACX,MAAM,oBAAoB,GAAG;IAC5B,gCAAgC;IAChC,wBAAwB;CACf,CAAC;AACX,MAAM,mBAAmB,GAAG,YAAY,CAAC;AAEzC,SAAS,cAAc,CAAC,KAAwB;IAC/C,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC;IACd,CAAC;IACD,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,eAAe,CAAC,KAAwB;IAChD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC;IACd,CAAC;IACD,OAAO,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,aAAa,CAAC,GAAuB;IAC7C,IAAI,CAAC,GAAG,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;IACX,CAAC;IACD,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;QAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAC1B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACnD,CAAC;YACD,OAAO,IAAI,CAAC;QACb,CAAC,CAAC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,2CAA2C,EAAE;YACxD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC7D,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC;AAED,SAAS,UAAU,CAClB,IAAc,EACd,IAAY,EACZ,KAAyB;IAEzB,IAAI,KAAK,EAAE,CAAC;QACX,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB;IACzB,MAAM,UAAU,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;IAC9C,IAAI,UAAU,EAAE,CAAC;QAChB,OAAO,UAAU,CAAC;IACnB,CAAC;IAED,MAAM,UAAU,GAAG;QAClB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC;QACnC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC;KAC/C,CAAC;IACF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CACpC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC,CAC9D,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB;IAC5B,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;IACjC,MAAM,iBAAiB,GAAG,WAAW,CAAC,gBAAgB,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,iBAAiB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IACrE,MAAM,GAAG,GAAG,aAAa,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,iBAAiB;QAC7B,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QAChB,CAAC,CAAC,IAAI;YACL,CAAC,CAAC,CAAC,KAAK,EAAE,qBAAqB,EAAE,GAAG,SAAS,CAAC;YAC9C,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IACnB,MAAM,WAAW,GAAG,WAAW,CAAC,kBAAkB,CAAC,CAAC;IACpD,MAAM,cAAc,GAAG,WAAW,CAAC,wBAAwB,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,WAAW,CAAC,iBAAiB,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,WAAW,CAAC,mBAAmB,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,WAAW,CAAC,gBAAgB,CAAC,CAAC;IAE7C,UAAU,CAAC,IAAI,EAAE,eAAe,EAAE,WAAW,CAAC,CAAC;IAC/C,UAAU,CAAC,IAAI,EAAE,kBAAkB,EAAE,cAAc,CAAC,CAAC;IACrD,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACvC,UAAU,CAAC,IAAI,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IAC3C,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IACrC,IAAI,cAAc,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAC7B,MAAM,CAAC,OAAO,CAAC;QACd,qBAAqB,EAAE,SAAS;QAChC,kBAAkB,EAAE,SAAS;QAC7B,uBAAuB,EAAE,WAAW;QACpC,eAAe,EAAE,OAAO;KACxB,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAA6B,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAClE,CAAC;IAEF,OAAO;QACN,IAAI,EAAE,WAAW,CAAC,aAAa,CAAC,IAAI,mBAAmB;QACvD,SAAS,EAAE,OAAO;QAClB,OAAO;QACP,IAAI;QACJ,GAAG;QACH,GAAG;QACH,KAAK,EAAE,QAAQ;KACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB;IACxC,IAAI,eAAe,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC5E,OAAO,EAAE,CAAC;IACX,CAAC;IACD,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;AACjC,CAAC","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getEnvValue } from \"../platform/client.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport type { McpServerConfig } from \"./types.js\";\n\nconst logger = createLogger(\"mcp:fathom-cua\");\n\nconst DISABLED_VALUES = new Set([\"0\", \"false\", \"no\", \"off\"]);\nconst ENABLED_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_ENABLED\",\n\t\"FATHOM_CUA_MCP_ENABLED\",\n] as const;\nconst NAME_ENV_VARS = [\"MAESTRO_FATHOM_CUA_MCP_NAME\", \"FATHOM_CUA_MCP_NAME\"];\nconst COMMAND_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_CLIENT_COMMAND\",\n\t\"FATHOM_CUA_CLIENT_COMMAND\",\n] as const;\nconst ARGS_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_CLIENT_ARGS_JSON\",\n\t\"FATHOM_CUA_CLIENT_ARGS_JSON\",\n] as const;\nconst REPO_ENV_VARS = [\"MAESTRO_FATHOM_CUA_REPO\", \"FATHOM_CUA_REPO\"] as const;\nconst CWD_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_CLIENT_CWD\",\n\t\"FATHOM_CUA_CLIENT_CWD\",\n] as const;\nconst WORKSPACE_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_WORKSPACE_ID\",\n\t\"FATHOM_CUA_WORKSPACE_ID\",\n\t\"MAESTRO_WORKSPACE_ID\",\n\t\"MAESTRO_EVALOPS_WORKSPACE_ID\",\n\t\"EVALOPS_WORKSPACE_ID\",\n] as const;\nconst HELPER_ENDPOINT_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_HELPER_ENDPOINT\",\n\t\"FATHOM_CUA_HELPER_ENDPOINT\",\n] as const;\nconst IPC_ROOT_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_IPC_ROOT\",\n\t\"FATHOM_CUA_IPC_ROOT\",\n\t\"FATHOM_IPC_ROOT\",\n] as const;\nconst SESSION_ID_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_SESSION_ID\",\n\t\"FATHOM_CUA_SESSION_ID\",\n\t\"MAESTRO_SESSION_ID\",\n] as const;\nconst TURN_ID_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_TURN_ID\",\n\t\"FATHOM_CUA_TURN_ID\",\n\t\"MAESTRO_AGENT_RUN_ID\",\n\t\"MAESTRO_REQUEST_ID\",\n] as const;\nconst DISABLE_IPC_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_DISABLE_IPC\",\n\t\"FATHOM_CUA_DISABLE_IPC\",\n] as const;\nconst DEFAULT_SERVER_NAME = \"fathom-cua\";\n\nfunction envFlagEnabled(names: readonly string[]): boolean {\n\tconst value = getEnvValue(names);\n\tif (!value) {\n\t\treturn false;\n\t}\n\treturn !DISABLED_VALUES.has(value.trim().toLowerCase());\n}\n\nfunction envFlagDisabled(names: readonly string[]): boolean {\n\tconst value = getEnvValue(names);\n\tif (!value) {\n\t\treturn false;\n\t}\n\treturn DISABLED_VALUES.has(value.trim().toLowerCase());\n}\n\nfunction parseArgsJson(raw: string | undefined): string[] {\n\tif (!raw) {\n\t\treturn [];\n\t}\n\ttry {\n\t\tconst parsed = JSON.parse(raw) as unknown;\n\t\tif (!Array.isArray(parsed)) {\n\t\t\tthrow new Error(\"expected an array\");\n\t\t}\n\t\treturn parsed.map((item) => {\n\t\t\tif (typeof item !== \"string\") {\n\t\t\t\tthrow new Error(\"expected only string arguments\");\n\t\t\t}\n\t\t\treturn item;\n\t\t});\n\t} catch (error) {\n\t\tlogger.warn(\"Ignoring invalid Fathom CUA MCP args JSON\", {\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t});\n\t\treturn [];\n\t}\n}\n\nfunction appendFlag(\n\targs: string[],\n\tflag: string,\n\tvalue: string | undefined,\n): void {\n\tif (value) {\n\t\targs.push(flag, value);\n\t}\n}\n\nfunction resolveFathomRepo(): string | undefined {\n\tconst configured = getEnvValue(REPO_ENV_VARS);\n\tif (configured) {\n\t\treturn configured;\n\t}\n\n\tconst candidates = [\n\t\tjoin(process.cwd(), \"..\", \"fathom\"),\n\t\tjoin(process.cwd(), \"..\", \"..\", \"fathom\"),\n\t\tjoin(process.cwd(), \"..\", \"..\", \"..\", \"fathom\"),\n\t];\n\treturn candidates.find((candidate) =>\n\t\texistsSync(join(candidate, \"cmd\", \"fathom-client\", \"main.go\")),\n\t);\n}\n\nfunction buildFathomCuaServer(): McpServerConfig {\n\tconst repo = resolveFathomRepo();\n\tconst configuredCommand = getEnvValue(COMMAND_ENV_VARS);\n\tconst configuredCwd = getEnvValue(CWD_ENV_VARS);\n\tconst command = configuredCommand ?? (repo ? \"go\" : \"fathom-client\");\n\tconst cwd = configuredCwd ?? (configuredCommand ? undefined : repo);\n\tconst extraArgs = parseArgsJson(getEnvValue(ARGS_ENV_VARS));\n\tconst args = configuredCommand\n\t\t? [...extraArgs]\n\t\t: repo\n\t\t\t? [\"run\", \"./cmd/fathom-client\", ...extraArgs]\n\t\t\t: [...extraArgs];\n\tconst workspaceId = getEnvValue(WORKSPACE_ENV_VARS);\n\tconst helperEndpoint = getEnvValue(HELPER_ENDPOINT_ENV_VARS);\n\tconst ipcRoot = getEnvValue(IPC_ROOT_ENV_VARS);\n\tconst sessionId = getEnvValue(SESSION_ID_ENV_VARS);\n\tconst turnId = getEnvValue(TURN_ID_ENV_VARS);\n\n\tappendFlag(args, \"-workspace-id\", workspaceId);\n\tappendFlag(args, \"-helper-endpoint\", helperEndpoint);\n\tappendFlag(args, \"-ipc-root\", ipcRoot);\n\tappendFlag(args, \"-session-id\", sessionId);\n\tappendFlag(args, \"-turn-id\", turnId);\n\tif (envFlagEnabled(DISABLE_IPC_ENV_VARS)) {\n\t\targs.push(\"-disable-ipc\");\n\t}\n\n\tconst env = Object.fromEntries(\n\t\tObject.entries({\n\t\t\tFATHOM_CALLER_PRODUCT: \"maestro\",\n\t\t\tFATHOM_CUA_PRODUCT: \"maestro\",\n\t\t\tFATHOM_CUA_WORKSPACE_ID: workspaceId,\n\t\t\tFATHOM_IPC_ROOT: ipcRoot,\n\t\t}).filter((entry): entry is [string, string] => Boolean(entry[1])),\n\t);\n\n\treturn {\n\t\tname: getEnvValue(NAME_ENV_VARS) ?? DEFAULT_SERVER_NAME,\n\t\ttransport: \"stdio\",\n\t\tcommand,\n\t\targs,\n\t\tcwd,\n\t\tenv,\n\t\tscope: \"plugin\",\n\t};\n}\n\nexport function getFathomCuaPluginServers(): McpServerConfig[] {\n\tif (envFlagDisabled(ENABLED_ENV_VARS) || !envFlagEnabled(ENABLED_ENV_VARS)) {\n\t\treturn [];\n\t}\n\treturn [buildFathomCuaServer()];\n}\n"]}
|
|
1
|
+
{"version":3,"file":"fathom-cua.js","sourceRoot":"","sources":["../../src/mcp/fathom-cua.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getEnvValue } from \"../platform/client.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport type { McpServerConfig } from \"./types.js\";\n\nconst logger = createLogger(\"mcp:fathom-cua\");\n\nconst DISABLED_VALUES = new Set([\"0\", \"false\", \"no\", \"off\"]);\nconst ENABLED_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_ENABLED\",\n\t\"FATHOM_CUA_MCP_ENABLED\",\n] as const;\nconst NAME_ENV_VARS = [\"MAESTRO_FATHOM_CUA_MCP_NAME\", \"FATHOM_CUA_MCP_NAME\"];\nconst COMMAND_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_CLIENT_COMMAND\",\n\t\"FATHOM_CUA_CLIENT_COMMAND\",\n] as const;\nconst ARGS_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_CLIENT_ARGS_JSON\",\n\t\"FATHOM_CUA_CLIENT_ARGS_JSON\",\n] as const;\nconst REPO_ENV_VARS = [\"MAESTRO_FATHOM_CUA_REPO\", \"FATHOM_CUA_REPO\"] as const;\nconst CWD_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_CLIENT_CWD\",\n\t\"FATHOM_CUA_CLIENT_CWD\",\n] as const;\nconst WORKSPACE_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_WORKSPACE_ID\",\n\t\"FATHOM_CUA_WORKSPACE_ID\",\n\t\"MAESTRO_WORKSPACE_ID\",\n\t\"MAESTRO_EVALOPS_WORKSPACE_ID\",\n\t\"EVALOPS_WORKSPACE_ID\",\n] as const;\nconst HELPER_ENDPOINT_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_HELPER_ENDPOINT\",\n\t\"FATHOM_CUA_HELPER_ENDPOINT\",\n] as const;\nconst IPC_ROOT_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_IPC_ROOT\",\n\t\"FATHOM_CUA_IPC_ROOT\",\n\t\"FATHOM_IPC_ROOT\",\n] as const;\nconst SESSION_ID_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_SESSION_ID\",\n\t\"FATHOM_CUA_SESSION_ID\",\n\t\"MAESTRO_SESSION_ID\",\n] as const;\nconst TURN_ID_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_TURN_ID\",\n\t\"FATHOM_CUA_TURN_ID\",\n\t\"MAESTRO_AGENT_RUN_ID\",\n\t\"MAESTRO_REQUEST_ID\",\n] as const;\nconst DISABLE_IPC_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_DISABLE_IPC\",\n\t\"FATHOM_CUA_DISABLE_IPC\",\n] as const;\nconst TOOL_PROFILE_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_TOOL_PROFILE\",\n\t\"FATHOM_CUA_TOOL_PROFILE\",\n] as const;\nconst DEFAULT_SERVER_NAME = \"fathom-cua\";\nconst DEFAULT_TOOL_PROFILE = \"canonical\";\n\nfunction envFlagEnabled(names: readonly string[]): boolean {\n\tconst value = getEnvValue(names);\n\tif (!value) {\n\t\treturn false;\n\t}\n\treturn !DISABLED_VALUES.has(value.trim().toLowerCase());\n}\n\nfunction envFlagDisabled(names: readonly string[]): boolean {\n\tconst value = getEnvValue(names);\n\tif (!value) {\n\t\treturn false;\n\t}\n\treturn DISABLED_VALUES.has(value.trim().toLowerCase());\n}\n\nfunction parseArgsJson(raw: string | undefined): string[] {\n\tif (!raw) {\n\t\treturn [];\n\t}\n\ttry {\n\t\tconst parsed = JSON.parse(raw) as unknown;\n\t\tif (!Array.isArray(parsed)) {\n\t\t\tthrow new Error(\"expected an array\");\n\t\t}\n\t\treturn parsed.map((item) => {\n\t\t\tif (typeof item !== \"string\") {\n\t\t\t\tthrow new Error(\"expected only string arguments\");\n\t\t\t}\n\t\t\treturn item;\n\t\t});\n\t} catch (error) {\n\t\tlogger.warn(\"Ignoring invalid Fathom CUA MCP args JSON\", {\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t});\n\t\treturn [];\n\t}\n}\n\nfunction appendFlag(\n\targs: string[],\n\tflag: string,\n\tvalue: string | undefined,\n): void {\n\tif (value) {\n\t\targs.push(flag, value);\n\t}\n}\n\nfunction resolveToolProfile(): string {\n\treturn getEnvValue(TOOL_PROFILE_ENV_VARS)?.trim() || DEFAULT_TOOL_PROFILE;\n}\n\nfunction resolveFathomRepo(): string | undefined {\n\tconst configured = getEnvValue(REPO_ENV_VARS);\n\tif (configured) {\n\t\treturn configured;\n\t}\n\n\tconst candidates = [\n\t\tjoin(process.cwd(), \"..\", \"fathom\"),\n\t\tjoin(process.cwd(), \"..\", \"..\", \"fathom\"),\n\t\tjoin(process.cwd(), \"..\", \"..\", \"..\", \"fathom\"),\n\t];\n\treturn candidates.find((candidate) =>\n\t\texistsSync(join(candidate, \"cmd\", \"fathom-client\", \"main.go\")),\n\t);\n}\n\nfunction buildFathomCuaServer(): McpServerConfig {\n\tconst repo = resolveFathomRepo();\n\tconst configuredCommand = getEnvValue(COMMAND_ENV_VARS);\n\tconst configuredCwd = getEnvValue(CWD_ENV_VARS);\n\tconst command = configuredCommand ?? (repo ? \"go\" : \"fathom-client\");\n\tconst cwd = configuredCwd ?? (configuredCommand ? undefined : repo);\n\tconst extraArgs = parseArgsJson(getEnvValue(ARGS_ENV_VARS));\n\tconst args = configuredCommand\n\t\t? [...extraArgs]\n\t\t: repo\n\t\t\t? [\"run\", \"./cmd/fathom-client\", ...extraArgs]\n\t\t\t: [...extraArgs];\n\tconst workspaceId = getEnvValue(WORKSPACE_ENV_VARS);\n\tconst helperEndpoint = getEnvValue(HELPER_ENDPOINT_ENV_VARS);\n\tconst ipcRoot = getEnvValue(IPC_ROOT_ENV_VARS);\n\tconst sessionId = getEnvValue(SESSION_ID_ENV_VARS);\n\tconst turnId = getEnvValue(TURN_ID_ENV_VARS);\n\tconst toolProfile = resolveToolProfile();\n\n\tappendFlag(args, \"-tool-profile\", toolProfile);\n\tappendFlag(args, \"-workspace-id\", workspaceId);\n\tappendFlag(args, \"-helper-endpoint\", helperEndpoint);\n\tappendFlag(args, \"-ipc-root\", ipcRoot);\n\tappendFlag(args, \"-session-id\", sessionId);\n\tappendFlag(args, \"-turn-id\", turnId);\n\tif (envFlagEnabled(DISABLE_IPC_ENV_VARS)) {\n\t\targs.push(\"-disable-ipc\");\n\t}\n\n\tconst env = Object.fromEntries(\n\t\tObject.entries({\n\t\t\tFATHOM_CALLER_PRODUCT: \"maestro\",\n\t\t\tFATHOM_CUA_PRODUCT: \"maestro\",\n\t\t\tFATHOM_CUA_WORKSPACE_ID: workspaceId,\n\t\t\tFATHOM_IPC_ROOT: ipcRoot,\n\t\t}).filter((entry): entry is [string, string] => Boolean(entry[1])),\n\t);\n\n\treturn {\n\t\tname: getEnvValue(NAME_ENV_VARS) ?? DEFAULT_SERVER_NAME,\n\t\ttransport: \"stdio\",\n\t\tcommand,\n\t\targs,\n\t\tcwd,\n\t\tenv,\n\t\tscope: \"plugin\",\n\t};\n}\n\nexport function getFathomCuaPluginServers(): McpServerConfig[] {\n\tif (envFlagDisabled(ENABLED_ENV_VARS) || !envFlagEnabled(ENABLED_ENV_VARS)) {\n\t\treturn [];\n\t}\n\treturn [buildFathomCuaServer()];\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/mcp/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAInE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC/E,OAAO,EAIN,KAAK,IAAI,IAAI,OAAO,EAMpB,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/mcp/manager.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/manager.js
CHANGED
|
@@ -50,6 +50,7 @@ import { getHomeDir } from "../utils/path-expansion.js";
|
|
|
50
50
|
import { buildMcpElicitationToolCallId, getCurrentMcpClientToolService, normalizeMcpElicitationArgs, parseMcpElicitationClientToolResult, } from "./elicitation.js";
|
|
51
51
|
import { getMcpRemoteHost, getOfficialMcpRegistryMatch, } from "./official-registry.js";
|
|
52
52
|
import { getProjectMcpServerApprovalStatus } from "./project-approvals.js";
|
|
53
|
+
import { classifyToolCapability, summarizeToolCapabilities, } from "./tool-capabilities.js";
|
|
53
54
|
import { ensureMcpWorkspaceTrusted } from "./workspace-trust.js";
|
|
54
55
|
const logger = createLogger("mcp:manager");
|
|
55
56
|
const execFileAsync = promisify(execFile);
|
|
@@ -155,6 +156,24 @@ function summarizeServerParallelSafety(config, connected) {
|
|
|
155
156
|
: {}),
|
|
156
157
|
};
|
|
157
158
|
}
|
|
159
|
+
function toolsWithCapabilityStatus(serverName, tools, parallelSafetyByTool) {
|
|
160
|
+
return tools.map((tool) => ({
|
|
161
|
+
...tool,
|
|
162
|
+
capability: classifyToolCapability({
|
|
163
|
+
server: serverName,
|
|
164
|
+
toolName: tool.name,
|
|
165
|
+
annotations: capabilityAnnotations(tool, parallelSafetyByTool?.get(tool.name)),
|
|
166
|
+
}),
|
|
167
|
+
}));
|
|
168
|
+
}
|
|
169
|
+
function capabilityAnnotations(tool, parallelSafety) {
|
|
170
|
+
const annotations = asRecord(tool.annotations);
|
|
171
|
+
if (parallelSafety?.readOnlyHint !== true ||
|
|
172
|
+
annotations?.readOnlyHint !== undefined) {
|
|
173
|
+
return annotations;
|
|
174
|
+
}
|
|
175
|
+
return { ...annotations, readOnlyHint: true };
|
|
176
|
+
}
|
|
158
177
|
function arraysEqual(left, right) {
|
|
159
178
|
if (left === right) {
|
|
160
179
|
return true;
|
|
@@ -572,6 +591,9 @@ export class McpClientManager extends EventEmitter {
|
|
|
572
591
|
serverCapabilities,
|
|
573
592
|
tools,
|
|
574
593
|
});
|
|
594
|
+
const toolCapabilitySummary = summarizeToolCapabilities(toolsWithCapabilityStatus(name, tools, parallelSafetyByTool)
|
|
595
|
+
.map((tool) => tool.capability)
|
|
596
|
+
.filter((capability) => capability !== undefined));
|
|
575
597
|
this.servers.set(name, {
|
|
576
598
|
config,
|
|
577
599
|
client,
|
|
@@ -595,6 +617,7 @@ export class McpClientManager extends EventEmitter {
|
|
|
595
617
|
toolCount: tools.length,
|
|
596
618
|
resourceCount: resources.length,
|
|
597
619
|
promptCount: prompts.length,
|
|
620
|
+
toolCapabilitySummary,
|
|
598
621
|
isReconnect,
|
|
599
622
|
clientVersion: getPackageVersion(),
|
|
600
623
|
}).catch(() => undefined);
|
|
@@ -884,6 +907,9 @@ export class McpClientManager extends EventEmitter {
|
|
|
884
907
|
// Include configured but not connected servers
|
|
885
908
|
for (const config of this.config.servers) {
|
|
886
909
|
const connected = this.servers.get(config.name);
|
|
910
|
+
const tools = connected
|
|
911
|
+
? toolsWithCapabilityStatus(config.name, connected.tools, connected.parallelSafetyByTool)
|
|
912
|
+
: [];
|
|
887
913
|
const projectApproval = approvalMap.get(config.name);
|
|
888
914
|
const resolvedAuth = resolveRemoteAuthConfig(config, authPresetMap);
|
|
889
915
|
const remoteUrl = config.transport === "http" || config.transport === "sse"
|
|
@@ -901,7 +927,12 @@ export class McpClientManager extends EventEmitter {
|
|
|
901
927
|
: this.lastErrors.get(config.name),
|
|
902
928
|
scope: config.scope,
|
|
903
929
|
transport: config.transport,
|
|
904
|
-
tools
|
|
930
|
+
tools,
|
|
931
|
+
toolCapabilitySummary: tools.length > 0
|
|
932
|
+
? summarizeToolCapabilities(tools
|
|
933
|
+
.map((tool) => tool.capability)
|
|
934
|
+
.filter((capability) => capability !== undefined))
|
|
935
|
+
: undefined,
|
|
905
936
|
resources: connected?.resources ?? [],
|
|
906
937
|
prompts: connected?.prompts ?? [],
|
|
907
938
|
promptDetails: connected && connected.promptDetails.length > 0
|