mcp-data-platform-v1.62.4
Try It tab can now invoke platform-level tools
The portal Tools "Try It" tab's connection field rendered as a disabled, empty dropdown for any tool that takes connection as a parameter rather than being toolkit-bound. Affected tools: api_list_endpoints, api_get_endpoint_schema, api_invoke_endpoint, api_export, and similar platform-level meta-tools. Operators had no way to invoke these from the portal.
This release fixes the picker and adds an empty-state helper for the no-matching-connections-registered case.
PR #425.
Root cause
ToolForm.tsx rendered the connection field with a single branch that assumed every tool was bound to a connection at toolkit-registration time:
// pre-fix
<select disabled value={selectedConnection}>
<option value={selectedConnection}>{selectedConnection}</option>
</select>That works for tools the toolkit registered under a specific connection. It fails for platform-level meta-tools whose schema has connection: "" and needs the operator to pick a target at call time. The select rendered empty with no options.
Fix
ToolForm branches on the binding state
| State | Render |
|---|---|
selectedConnection non-empty (bound) |
Locked select showing the bound name. Unchanged behavior. |
selectedConnection empty + connections of the tool's kind exist |
Enabled <select name="connection" required> populated from a new availableConnections prop. Operator picks at call time. |
selectedConnection empty + no matching connections |
Disabled select plus an amber helper message: "No {kind} connections registered. Add one in Settings to invoke this tool." |
A new prop availableConnections?: EffectiveConnection[] is filtered by the caller to the tool's kind so the dropdown lists only valid targets.
TryItTab wires the picker
- Fetches connections via
useEffectiveConnections(). - Filters by
schema.kind(anapitool sees api-kind connections only; anmcptool sees mcp-kind only). - Passes the result through as
availableConnections.
Replay/History invariant preserved
The handler destructures connection off form params into a fresh outParams object rather than mutating in place:
const { connection: _routing, ...rest } = params;
outParams = rest;This is load-bearing for the History panel and the Replay action. The params reference passed in is the same object stored in the history entry one line earlier (addHistoryEntry({ ..., parameters: params })). A naive delete params.connection would strip it from the already-stored entry, breaking Replay (which re-applies entry.parameters to the form). Destructuring keeps the history reference intact and removes connection only from the wire payload.
The bound case continues to take precedence so connection-grouped tools still route to their toolkit.
Tests
ui/src/pages/tools/ToolForm.test.tsx (new), 5 tests pinning every branch:
- Locked select renders when
selectedConnectionis bound. - Enabled picker with
name="connection"and the supplied options renders when unbound. - Empty-list edge case renders the amber helper plus a disabled select.
- The operator's pick propagates into
params.connectionon submit. - Required-empty guard blocks the no-pick submit case.
Connection names in the tests use salesforce and github (generic vendor names per the standing rule).
Adversarial pre-commit review
Round 1 surfaced 2 substantive findings, both fixed:
- The original draft used
delete params.connection, which mutated the history entry's stored reference and broke Replay for unbound tools. Switched to destructuring into a newoutParamsobject. - The new test file used vendor-specific connection names. Scrubbed to generic ones.
Round 2: CLEAN.
make verify green (full suite: Go test/race, coverage, patch coverage, golangci-lint, gosec, govulncheck, semgrep, codeql, dead-code, mutation testing, GoReleaser dry-run, UI typecheck and vitest).
Upgrade notes
- No schema change, no config change, no breaking API change. Drop-in upgrade from v1.62.3.
- Platform-level tools that were previously uninvokable from the portal are now usable:
api_list_endpoints,api_get_endpoint_schema,api_invoke_endpoint,api_export, and any future tool of the same shape (registered without a bound connection, takesconnectionas a parameter). - Connection-bound tools render unchanged.
- When no connections of the matching kind exist, the field surfaces an amber helper line instead of a silently empty dropdown.
Installation
Homebrew (macOS)
brew install txn2/tap/mcp-data-platformClaude Code CLI
claude mcp add mcp-data-platform -- mcp-data-platformDocker
docker pull ghcr.io/txn2/mcp-data-platform:v1.62.4Verification
All release artifacts are signed with Cosign. Verify with:
cosign verify-blob --bundle mcp-data-platform_1.62.4_linux_amd64.tar.gz.sigstore.json \
mcp-data-platform_1.62.4_linux_amd64.tar.gz