multicorn-shield 0.8.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,365 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.10.0] - 2026-04-21
9
+
10
+ ### Added
11
+
12
+ - `requestContentReview()` and supporting types (`ContentReviewResult`, `ContentReviewRequestPayload`, `ContentReviewStatusResponse`) for submitting public-content actions to the Content Review queue and awaiting the human decision.
13
+ - `waitForReviewDecision` opt-in flag on `McpAdapterConfig`. When true, the MCP adapter blocks until a human approves or blocks the action (5 minute ceiling) and forwards the call if approved. Default false preserves existing block-fast behaviour.
14
+ - Public exports of `requiresContentReview` and `isPublicContentAction` from `src/scopes/content-review-detector.ts`.
15
+ - SDK-side mapping of backend `PLAN_TIER_INSUFFICIENT` responses to a distinct `plan_tier_insufficient` reason code with the "Content review requires an Enterprise plan" user message.
16
+
17
+ ### Changed
18
+
19
+ - `pollContentReviewStatus` fast-fails on 404 (maps to `review_not_found`) instead of retrying, diverging from `pollApprovalStatus` which treats 404 as transient. Content reviews can be hard-deleted by admin action in a way approvals cannot.
20
+
21
+ ## [0.9.0] - 2026-04-15
22
+
23
+ ### Added
24
+
25
+ - Windsurf native integration via Cascade Hooks (`pre_*` / `post_*` for reads, writes, terminal, and MCP). Hook scripts install to `~/.multicorn/windsurf-hooks/` and add entries to `~/.codeium/windsurf/hooks.json`.
26
+ - `npx multicorn-proxy init`: when you pick Windsurf, choose Native plugin (recommended) or Hosted proxy. Native path registers Shield hooks and reminds you to restart Windsurf.
27
+
28
+ ## [0.8.0] - 2026-04-12
29
+
30
+ ### Added
31
+
32
+ - Windsurf IDE as a supported platform in `npx multicorn-proxy init`. Generates a proxy config and prints an `~/.codeium/windsurf/mcp_config.json` snippet using the Windsurf `mcpServers` / `serverUrl` schema.
33
+ - Auto-detection of existing Windsurf proxy entries (shows "● detected locally" in the platform selection list).
34
+
35
+ ### Changed
36
+
37
+ - Next Steps block for Cursor and Windsurf rewritten as clear three-step numbered actions: download the IDE if needed, paste the config snippet, restart. Previous copy ("Config file: ...", "Restart Cursor to pick up MCP config changes") gave no guidance to first-time users.
38
+
39
+ ## [0.7.0] - 2026-04-11
40
+
41
+ ### Added
42
+
43
+ - New `--api-key <key>` CLI flag on `multicorn-proxy --wrap`. Lets users run the proxy without first creating a config file.
44
+ - New `MULTICORN_API_KEY` environment variable support. Resolves with priority `--api-key` flag > `MULTICORN_API_KEY` env var > `~/.multicorn/config.json`.
45
+ - New "Local MCP / Other" option in the `multicorn-proxy init` wizard. Skips the platform-specific setup steps and writes a minimal config suitable for wrapping any local MCP server with `--wrap`.
46
+ - SDK constructor now validates the API key format and rejects invalid keys (empty, wrong prefix, too short, or the literal placeholder `mcs_your_key_here`) with a clear error pointing at the settings page.
47
+
48
+ ### Changed
49
+
50
+ - `multicorn-proxy init` platform menu now labels detected platforms as "detected locally" instead of "connected", with a dimmed dot icon instead of a green checkmark. The previous label implied account-level connection state, but the underlying detection only checks for local config files.
51
+ - Error message when no API key is configured now mentions all three sources: the `--api-key` flag, the `MULTICORN_API_KEY` environment variable, and the `npx multicorn-proxy init` config file path.
52
+ - All references to the API keys settings page now use the fragment URL `https://app.multicorn.ai/settings#api-keys` instead of the previous `/settings/api-keys` path which did not exist.
53
+
54
+ ### Fixed
55
+
56
+ - `multicorn-proxy --wrap` now fails immediately at startup with a clear error if the configured API key is rejected by the Multicorn service. Previously the proxy logged "Agent resolved" and "Proxy ready" with empty agent state and only blocked tool calls at runtime, leaving users confused about why their setup was not working.
57
+ - `multicorn-proxy --wrap` now correctly accepts proxy flags (`--api-key`, `--base-url`, `--log-level`, `--dashboard-url`, `--agent-name`) when they appear between `--wrap` and the wrap command. Previously the parser bailed with "requires a command to run" because the early-exit guard rejected any flag-shaped token in that position before the stripping logic ran.
58
+ - `multicorn-proxy init` exit summary no longer renders a trailing dash for the "Local MCP / Other" option (which has no agent name). The summary line now reads `✓ Local MCP / Other` instead of `✓ Local MCP / Other -`.
59
+ - `multicorn-proxy init` no longer prints a misleading "Next steps" block referencing "Other MCP Agent" and `--agent-name` after the "Local MCP / Other" option. The "Try it" example printed inside the option 4 branch is sufficient guidance.
60
+
61
+ ## [0.6.2] - 2026-04-09
62
+
63
+ ### Fixed
64
+
65
+ - Proxy CLI `init` command now reads `baseUrl` from `~/.multicorn/config.json` on the new-key path, not just the reuse-key path. Previously required `--base-url` flag as a workaround.
66
+ - `--base-url` CLI flag correctly overrides config file value (previously indistinguishable from the default).
67
+
68
+ ### Added
69
+
70
+ - `readBaseUrlFromConfig()` helper for reading base URL from partial config files.
71
+ - `parseConfigFile()` shared helper eliminating duplicated file read/parse logic between `loadConfig` and `readBaseUrlFromConfig`.
72
+ - `isAllowedShieldApiBaseUrl()` exported validator for HTTPS/localhost scheme checks.
73
+ - `DEFAULT_SHIELD_API_BASE_URL` named constant replacing hardcoded fallback string.
74
+ - HTTPS scheme validation in `runInit()` init flow (previously only enforced in wrap flow).
75
+
76
+ ### Changed
77
+
78
+ - `runInit` parameter changed from `baseUrl = "https://api.multicorn.ai"` to `explicitBaseUrl?: string` to distinguish "no flag" from "explicitly passed default."
79
+ - Base URL resolution priority: explicit flag > full config > partial config > env var > default.
80
+ - HTTPS validation error messages no longer include the actual URL value.
81
+ - Wrap flow validates `--base-url` before loading config when the flag is present.
82
+
83
+ ## [0.6.1] - 2026-04-08
84
+
85
+ ### Fixed
86
+
87
+ - Updated README badges and npm package metadata to reflect current branding.
88
+
89
+ ## [0.6.0] - 2026-04-08
90
+
91
+ ### Added
92
+
93
+ - Multi-agent config support: `~/.multicorn/config.json` now stores an `agents` array with per-platform entries instead of a single `agentName`
94
+ - New CLI commands: `npx multicorn-proxy agents` (list configured agents) and `npx multicorn-proxy delete-agent <name>` (remove an agent)
95
+ - New exported helpers: `getAgentByPlatform()`, `getDefaultAgent()`, `collectAgentsFromConfig()`, `deleteAgentByName()`
96
+ - `AgentEntry` interface exported from the SDK
97
+ - Automatic migration: legacy single-agent configs are upgraded to the new format on first read and written back to disk
98
+ - Platform-based agent lookup in Claude Code hooks (`pre-tool-use.cjs`, `post-tool-use.cjs`), OpenClaw plugin, and Claude Desktop extension
99
+ - CLI agent name sanitisation: `delete-agent` strips non-printable characters before echoing to terminal
100
+
101
+ ### Changed
102
+
103
+ - `ProxyConfig` interface now includes optional `agents` (readonly `AgentEntry[]`) and `defaultAgent` fields
104
+ - `agentName` and `platform` fields on `ProxyConfig` are deprecated (kept for backward compatibility during migration)
105
+ - `runInit()` appends to the agents array instead of overwriting; detects duplicate platforms and prompts to replace
106
+ - Restored inline OpenClaw setup flow with version detection, auto-config of `~/.openclaw/openclaw.json`, and "Next steps" instructions (`openclaw gateway restart`, `openclaw tui`)
107
+ - Restored inline Claude Code setup instructions (marketplace add, plugin install, start claude, `/plugin` verification)
108
+ - "Next steps" summary restored at end of init wizard with per-platform instructions
109
+ - Help text clarified for non-technical users ("List configured agents and show which is the default", "Remove a saved agent")
110
+ - CJS hook duplication comment updated to explain why shared modules are not possible
111
+
112
+ ### Fixed
113
+
114
+ - Running `npx multicorn-proxy init` for a second platform no longer overwrites the first agent's config
115
+ - `delete-agent` clears `defaultAgent` when deleting the default agent instead of leaving a dangling reference
116
+
117
+ ### Security
118
+
119
+ - Agent names from CLI input are sanitised before echoing to stdout/stderr to prevent terminal escape sequence injection
120
+
121
+ ## [0.5.0] - 2026-04-08
122
+
123
+ Version number skipped. The `release:minor` script double-bumped from 0.4.0 to 0.5.0 (manual) then to 0.6.0 (automated). No separate 0.5.0 release exists on npm.
124
+
125
+ ## [0.4.0] - 2026-04-08
126
+
127
+ ### Changed
128
+
129
+ - CLI rewrite: extracted platform selection, agent naming, and proxy config prompts into separate helper functions
130
+ - Reduced platform options from 4 (OpenClaw, Claude Code, Claude Desktop, Other MCP Agent) to 3 (OpenClaw, Claude Code, Cursor)
131
+ - Cursor connection detection via `~/.cursor/mcp.json`
132
+ - Claude Code connection detection via `~/.claude/plugins/cache/multicorn-shield`
133
+ - Cursor (selection 3) now prompts for target MCP server URL and creates a hosted proxy config via the Shield API
134
+ - Platform-specific MCP config snippets shown after proxy config creation
135
+ - "Connect another agent?" prompt changed from `(y/N)` default-no to `(Y/n)` default-yes
136
+ - Setup complete summary now shows agent names and proxy URLs alongside platform labels
137
+
138
+ ### Removed
139
+
140
+ - Claude Desktop as a standalone platform option (now handled via Cursor/Other MCP path)
141
+ - "Next steps" grouped summary at end of init (replaced by inline instructions per platform)
142
+ - OpenClaw version detection and `updateOpenClawConfigIfPresent()` auto-config during init
143
+
144
+ ## [0.3.0] - 2026-04-08
145
+
146
+ Version number skipped. No 0.3.0 release exists on npm.
147
+
148
+ ## [0.2.2] - 2026-04-04
149
+
150
+ ### Added
151
+
152
+ - Claude Desktop Extension (.mcpb) for one-click install. Packages Shield as a Desktop Extension that wraps existing MCP servers, enforces permissions via the Shield API, and logs all tool calls.
153
+ - `npx multicorn-shield restore` command to recover original MCP server config after disabling the extension.
154
+ - `multicorn-shield/proxy` subpath export with interceptor helpers, consent utilities, logger, scope validator, and tool mapper for hosted proxy consumers.
155
+ - HTTP client for hosted proxy URLs (`proxy-client`) supporting Streamable HTTP transport, session management, and JSON-RPC error handling.
156
+ - Optional extension setting `base_url` (env `MULTICORN_BASE_URL`) for enterprise or self-hosted Shield API endpoints. Defaults to `https://api.multicorn.ai` when empty.
157
+
158
+ ### Changed
159
+
160
+ - Desktop Extension routes tool calls to hosted proxy URLs over Streamable HTTP instead of spawning child MCP processes locally. Permission enforcement and audit logging now run server-side, avoiding sandbox limits in Claude Desktop.
161
+ - `runInit` base URL resolution checks config file and `MULTICORN_BASE_URL` env var before falling back to the default API endpoint.
162
+ - `platform` field threaded through proxy config and CLI init flow for connection method tracking in the dashboard.
163
+
164
+ ## [0.2.1] - 2026-03-23
165
+
166
+ ### Security
167
+
168
+ - Claude Code PreToolUse hook now fails closed when the Shield API is unreachable or returns an error. Previously, all error paths exited with code 0 (allow). Now, any error after config is successfully loaded exits with code 2 (block). This matches the fail-closed behaviour of the OpenClaw plugin and MCP proxy since v0.1.15.
169
+
170
+ ## [0.2.0] - 2026-03-22
171
+
172
+ ### Added
173
+
174
+ - Claude Code plugin: PreToolUse hook intercepts tool calls and checks permissions via Shield API before allowing execution
175
+ - Claude Code plugin: PostToolUse hook logs completed tool calls to Shield audit trail
176
+ - Claude Code plugin: consent screen opens in browser on first tool call for new agents, polls for approval
177
+ - Claude Code plugin: consent marker file prevents repeated browser opens after initial consent
178
+ - Claude Desktop: CLI wizard auto-writes `claude_desktop_config.json` with MCP proxy config (macOS, Linux, Windows paths)
179
+ - Claude Desktop: wizard prompts for MCP server command and merges config without clobbering existing entries
180
+ - MCP proxy: comprehensive tool name mapper with explicit mappings for filesystem, git, web, terminal, email, and calendar MCP servers
181
+ - CLI wizard: "connected" checkmark for Claude Code and Claude Desktop in platform selection menu
182
+ - CLI wizard: Step 3 added to Claude Code output ("Start Claude Code: claude")
183
+ - Agent name validation: must match /^[a-zA-Z0-9_-]+$/ before use in config files
184
+ - `shell` tool name mapping to terminal:execute in Claude Code hook (covers Claude Code's Shell tool variant)
185
+
186
+ ### Changed
187
+
188
+ - Claude Desktop wizard path now auto-writes config instead of showing manual JSON snippet (falls back to manual on invalid JSON or user skip)
189
+ - MCP proxy tool mapping replaced: `extractServiceFromToolName`/`extractActionFromToolName` underscore-split replaced with explicit `mapMcpToolToScope` lookup table
190
+ - `isClaudeDesktopConnected` uses proper args array inspection instead of substring match on serialized JSON
191
+
192
+ ### Fixed
193
+
194
+ - Claude Code plugin install: removed `skills` array from plugin.json that caused validation error on `claude plugin install`
195
+ - Claude Code consent flow: consent screen only opens once per agent (not per scope), subsequent permission requests block with approvals link
196
+ - Claude Code hook: localhost:8080 API base URL correctly maps to localhost:5173 dashboard URL for consent and approvals links
197
+ - MCP proxy: filesystem server tools (read_file, write_file, list_directory, etc.) now correctly map to filesystem:read/write instead of garbage service names
198
+
199
+ ## [0.1.16] - 2026-03-21
200
+
201
+ ### Added
202
+
203
+ - Claude Code marketplace manifest at `.claude-plugin/marketplace.json`
204
+ - Claude Code plugin structure at `plugins/multicorn-shield/` with plugin.json and shield-governance skill
205
+ - Repository field added to marketplace.json linking to GitHub source
206
+
207
+ ## [0.1.15] - 2026-03-13
208
+
209
+ ### Changed
210
+
211
+ - All proxy and plugin failure modes now fail closed (block action when Shield cannot verify permissions)
212
+ - `handleHttpError` returns `shouldBlock: true` for 429 (rate limit) and 5xx (server error), matching the existing `checkActionPermission` behavior and fixing misleading comments
213
+ - Service-unreachable, auth-error, and internal-error responses use distinct JSON-RPC error codes: -32000 (permission denied), -32002 (internal error), -32003 (service unreachable), -32004 (auth error)
214
+ - Plugin output filename changed from `index.js` to `multicorn-shield.js` to fix OpenClaw plugin ID mismatch warning
215
+
216
+ ### Added
217
+
218
+ - `ShieldAuthError` class for clean 401/403 error propagation through `resolveAgentRecord`
219
+ - `buildInternalErrorResponse`, `buildServiceUnreachableResponse`, and `buildAuthErrorResponse` in interceptor module
220
+ - Early auth-invalid and offline-mode guards at the top of `handleToolCall` (before scope validation)
221
+ - `authInvalid` flag on `AgentRecord` for propagating auth failures from consent module to proxy
222
+ - `proxy.fail-closed.test.ts` covering service-down, timeout, 500, malformed JSON, 401, 403, and internal error scenarios
223
+ - `plugin.fail-closed.test.ts` covering exception handling, 5xx responses, and malformed response blocking
224
+
225
+ ### Fixed
226
+
227
+ - Proxy `handleToolCall` no longer hangs or returns wrong error code when service is unreachable at startup
228
+ - `findAgentByName` wraps `response.json()` in try/catch so malformed responses flow through the offline path instead of throwing unhandled rejections
229
+ - Existing test assertions updated to match new error codes (-32003 for service unreachable, -32004 for auth errors)
230
+
231
+ ## [0.1.14] - 2026-03-12
232
+
233
+ ### Fixed
234
+
235
+ - Audit log payload column uses `text` instead of `jsonb` to preserve SHA-256 hash chain integrity (PostgreSQL `jsonb` normalizes key ordering and whitespace)
236
+ - `Instant.toString()` timestamp precision preserved using `DateTimeFormatter` with `SSSSSS` pattern in `AuditHasher.formatTimestamp()`
237
+ - All 40 integration tests passing after audit log migration (V030)
238
+
239
+ ## [0.1.13] - 2026-03-10
240
+
241
+ ### Fixed
242
+
243
+ - Consent screen now pre-selects the permission level the agent actually requested (e.g. terminal:execute pre-selects the Execute button)
244
+ - Scope param parsing supports both formats: service:permission (terminal:execute) and permission:service (execute:terminal)
245
+ - deriveDashboardUrl respects MULTICORN_BASE_URL env var for local development instead of always resolving to production
246
+ - Plugin re-checks permission after consent completes in the blocked path, so the user doesn't have to trigger a second tool call
247
+
248
+ ## [0.1.12] - 2026-03-10
249
+
250
+ (version bump only - failed publish on 0.1.11)
251
+
252
+ ## [0.1.11] - 2026-03-10
253
+
254
+ ### Fixed
255
+
256
+ - Approval flow: plugin correctly handles consent-then-permission-check sequence
257
+ - Flaky tests stabilised across handler, plugin, proxy blocking, and edge-case suites
258
+
259
+ ## [0.1.10] - 2026-03-05
260
+
261
+ ### Fixed
262
+
263
+ - Plugin fail mode now defaults to closed (block on API error, never fail open)
264
+ - approval_id field name corrected from camelCase to snake_case to match backend API
265
+ - Plugin beforeToolCall wrapped in try/catch so errors block instead of crashing silently
266
+ - Config cascade documented: ~/.multicorn/config.json takes priority over openclaw.json plugin env
267
+
268
+ ## [0.1.9] - 2026-03-04
269
+
270
+ ### Fixed
271
+
272
+ - API key resolution from config.json when openclaw.json env block is not available
273
+
274
+ ## [0.1.8] - 2026-03-04
275
+
276
+ ### Fixed
277
+
278
+ - Plugin correctly maps destructive exec commands (rm, mv, sudo, chmod) to terminal:write instead of terminal:execute
279
+ - Approval descriptions now show human-readable summaries instead of raw shell commands
280
+ - Agent polling removed in favour of immediate block with dashboard redirect (OpenClaw hook timeout was shorter than human approval time)
281
+
282
+ ## [0.1.7] - 2026-03-04
283
+
284
+ ### Added
285
+
286
+ - README header SVG banner
287
+
288
+ ### Changed
289
+
290
+ - Consent flow updated for OpenClaw Plugin API (replaces deprecated gateway hook approach)
291
+
292
+ ### Fixed
293
+
294
+ - Handler and plugin consent test alignment with new Plugin API structure
295
+
296
+ ## [0.1.6] - 2026-03-04
297
+
298
+ ### Added
299
+
300
+ - Comprehensive plugin test suite for beforeToolCall and afterToolCall hooks
301
+
302
+ ### Fixed
303
+
304
+ - Plugin registration and lifecycle handling with OpenClaw Plugin API
305
+
306
+ ## [0.1.5] - 2026-03-04
307
+
308
+ ### Fixed
309
+
310
+ - Test stability improvements across the full suite
311
+
312
+ ### Changed
313
+
314
+ - Package metadata updates for npm listing
315
+
316
+ ## [0.1.4] - 2026-03-04
317
+
318
+ ### Changed
319
+
320
+ - MCP proxy improved for edge cases in tool call interception
321
+
322
+ ### Fixed
323
+
324
+ - Proxy test reliability
325
+
326
+ ## [0.1.3] - 2026-03-04
327
+
328
+ ### Added
329
+
330
+ - Shield API client (shield-client.ts) for permission checks and action logging from the plugin
331
+ - Consent flow module with browser-open and polling for user authorization
332
+ - OpenClaw Plugin API integration (beforeToolCall/afterToolCall hooks)
333
+ - Tool name mapper: OpenClaw tools (exec, read, write, browser, message) mapped to Shield service scopes
334
+ - Hook documentation (HOOK.md)
335
+
336
+ ### Fixed
337
+
338
+ - OpenClaw integration issues discovered during end-to-end testing
339
+
340
+ ## [0.1.2] - 2026-03-04
341
+
342
+ (version bump only - testing OIDC trusted publishing workflow)
343
+
344
+ ## [0.1.1] - 2026-03-04
345
+
346
+ ### Fixed
347
+
348
+ - Plugin loading path resolution for OpenClaw
349
+
350
+ ### Changed
351
+
352
+ - Publish workflow switched to OIDC trusted publishing via GitHub Actions
353
+
354
+ ## [0.1.0] - 2026-02-18
355
+
356
+ ### Added
357
+
358
+ - Consent screen web component with Shadow DOM isolation, focus trapping, and keyboard navigation
359
+ - Scope system with hierarchical definitions, parsing, and validation
360
+ - Action logger for audit-trail recording of agent activity
361
+ - Spending controls with per-agent and per-scope limit checking
362
+ - MCP protocol adapter for Model Context Protocol integration
363
+ - TypeScript strict mode with full type safety across all modules
364
+ - ESM and CJS dual-format builds via tsup
365
+ - Full test suite with >85% coverage thresholds
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Multicorn AI
3
+ Copyright (c) 2026 Multicorn AI Pty Ltd
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -584,10 +584,38 @@ multicorn-shield/
584
584
  └── eslint.config.ts # Linting rules
585
585
  ```
586
586
 
587
+ ## Publishing & ownership
588
+
589
+ Releases are published from a single GitHub Actions workflow (.github/workflows/publish.yml). It is manually dispatched (workflow_dispatch) with a patch/minor/major input. Each run installs dependencies, runs lint, typecheck, tests, and build, then bumps the package version with npm version (which creates a version commit and tag locally), publishes to npm with pnpm publish --no-git-checks --access public --provenance, and pushes the commit and tag with git push --follow-tags. After that, the same run may POST to a Vercel deploy hook (repository secret) to refresh the learn site. That hook does not publish to npm. No other workflow publishes this package.
590
+
591
+ The npm publish step uses a scoped automation token stored as one repository secret (`NPM_TOKEN`), only for this workflow, with npm provenance enabled on the publish command.
592
+
593
+ The npm package has a single publisher account (`multicorn-ai`). If you see a Socket.dev "unstable ownership" warning after an earlier publish-identity change, it often clears as the registry history stabilizes across the next few releases.
594
+
595
+ For compromised-package or supply-chain concerns, see [SECURITY.md](SECURITY.md).
596
+
597
+ ## Network behaviour
598
+
599
+ The SDK and CLI make outbound requests to the following hosts:
600
+
601
+ **api.multicorn.ai** (control plane; default)
602
+
603
+ - Consent creation and approval polling
604
+ - Action audit submission
605
+ - Spending checks
606
+ - Invoked only when the host application calls SDK or CLI methods, or when the proxy or extension runs its control-plane logic. There is no import-time network activity.
607
+
608
+ **127.0.0.1 / localhost** (local proxy, when running in proxy mode)
609
+
610
+ - IPC between the CLI wrapper and the local proxy process
611
+ - Never leaves the user's machine
612
+
613
+ No telemetry, analytics, or phone-home calls. Outbound API URLs use fixed paths under a single configurable base URL: the SDK `baseUrl` option (default `https://api.multicorn.ai`), the `MULTICORN_BASE_URL` environment variable, or `baseUrl` in `~/.multicorn/config.json` for the proxy and related tooling. Hosts and paths are not built from agent tool parameters or request bodies.
614
+
587
615
  ## Contributing
588
616
 
589
617
  Contributions are welcome. Please read [CONTRIBUTING.md](CONTRIBUTING.md) before opening a pull request.
590
618
 
591
619
  ## License
592
620
 
593
- [MIT](LICENSE) © Multicorn AI
621
+ [MIT](LICENSE) © Multicorn AI Pty Ltd