Local qualification evidence
Verified October 10, 2026 on macOS ARM64. The adapter now uses the official MCP Go SDK v1.8.0 and JWX v3.3.0. These are local development results, not marketplace acceptance or testing inside actual ChatGPT/Claude.
| Area | Result |
|---|---|
| Portable contract | All 15 tool schemas/annotations and 16 structured/text result cases match captured FastMCP fixtures, including defaults, pagination, extra fields, and hostile evidence |
| Response failures | Malformed required data is rejected without exposing parser details; uncertain mutations retain same-key reconciliation and are never automatically retried |
| Daemon boundary | Real temporary daemon exercised through pairing, reads, preview/apply, receipt replay, lifecycle, evidence, and revocation; adapter serving imports no store/runtime package |
| Existing authorization | Concurrent retries, restart/expiry, principal isolation, stale reviews, generation guards, revoked access, denied commands/secrets, receipt-quota rollback, and delivery retry deduplication pass |
| Independent client | Official TypeScript client passes native stdio tools, UI-byte equality, both CLI entry points, mutation retries, revocation, and daemon survival after adapter close |
| HTTP | Both 2026-07-28 and 2025-11-25 formats pass, including concurrent identities, scope denial, binding rotation, discovery/challenges, and Host/Origin protection |
| JWT/JWKS | All six configured asymmetric algorithms pass; signature/claim/algorithm rejection, key rotation/removal, bounded unknown-key refresh, stale-cache failure, and redirect refusal pass |
| Pairing | A pairing created by the old packaged adapter works unchanged through both Go entry points; private files, existing-file refusal, bounded setup, nonce/Host/Origin/expiry checks, and concurrent pairing pass locally |
| Headless behavior | No UI resources or UI tool metadata are advertised without the bundle; unknown tools cannot reach the daemon; cancellation reaches the upstream request |
| UI components | Three tests pass: explicit apply, stable operation keys, expired previews, and hostile text |
| Browser UI | Two AppBridge journeys pass: restrictive CSP/light/dark/mobile/keyboard/offline behavior and actual native-Go-backed preview followed by explicit apply |
| Native package | Extracted macOS ARM64 ZIP is exercised by the independent TypeScript client; executable embeds the exact UI bundle and requires no installed Python/Node |
| Container | Scratch image contains the Go executable and CA certificates; read-only/no-network version smoke passes; missing OAuth config fails; real container verifies a synthetic HTTPS issuer and makes an authenticated HTTPS daemon call, rejecting missing/invalid tokens |
| Cross-compilation | MCP executable builds for Linux AMD64/ARM64, macOS Intel/ARM64, Windows AMD64; Windows private-ACL tests compile |
| Repository checks | Module tidiness, Go formatting/vet, normal and console,mcpui race suites, TypeScript build, bundle budget, workflow YAML parsing, and Git whitespace checks |
| Workflow skills | Both shared skills passed the skill-creator validator during the integration foundation work |
make test-mcp builds and tests the UI, runs the relevant Go race suites, and
executes the independent client and browser journeys. Install Playwright Chromium
once before running it locally. Container qualification is reproducible with:
docker build -f integrations/mcp/Dockerfile -t ding-mcp:qualification .
DING_MCP_CONTAINER=ding-mcp:qualification go test ./internal/mcpserver \
-run TestContainerTLSAndAuthentication -count=1 -v
The container test uses temporary synthetic credentials and its own certificate authority. It tests TLS verification and bearer authentication in the built artifact; real identity-provider login/registration/refresh is a separate gate.
Local artifact comparison
Same macOS ARM64 machine, version 0.1.0 and the same offline React UI. The reference is the earlier dependency-complete FastMCP/PyInstaller qualification artifact. Results are approximate and specific to these local builds.
| Measurement | Previous packaged adapter | Native Go adapter |
|---|---|---|
| Runtime directory disk use | 55.6 MiB | 13.3 MiB |
| Plugin ZIP | 28.8 MiB | 5.0 MiB |
| Initialize plus first tool listing, median of 10 sequential subprocess runs | 508 ms | 15 ms |
--version peak resident memory, one /usr/bin/time -lp sample |
53.8 MiB | 13.3 MiB |
The startup comparison uses the same independent SDK, temporary daemon, and
pairing. It includes process startup, MCP initialization, and tools/list.
It is not a cold-cache or sustained-load benchmark; the memory sample is a CLI
startup measurement, not steady-state server memory. Build time was not measured
comparably. Node remains a frontend build/test dependency; Python is removed
from integration source, dependency locks, builds, tests, packaging, and runtime.
Browser screenshots are generated under web/mcp-app/test-results/. Native
artifacts are under dist/go-mcp/; assembled packages are under dist/plugins/.
Generated artifacts and the temporary old runtime reference are not committed.
The native CI matrix covers Linux AMD64/ARM64, macOS Intel/ARM64, and Windows AMD64, including extracted-artifact execution. Those remote jobs have not run in this local session. Cross-compilation does not establish native behavior, including Windows ACL enforcement. Actual client installation, publisher review, signing/notarization, real IdP login/refresh, sustained upgrade testing, and marketplace publication remain release gates. MCP Events/chat wakeups and a full service installer/updater remain outside this port.