Skip to content

v0.3.0

Choose a tag to compare

@minghsuy minghsuy released this 30 Jul 16:02
· 50 commits to main since this release
b2a44bd

What's changed in v0.3.0

npm: npm install ctscout-mcp-server@0.3.0 or npx ctscout-mcp-server@0.3.0

Added

  • MCP 2026-07-28 stdio discovery via server/discover, while preserving the
    legacy 2025 initialize handshake for existing clients (#73)
  • Reproducible release verification that installs the exact npm tarball in a
    clean offline consumer project, boots through its installed .bin, and
    protocol-tests modern discovery plus legacy/modern tool calls (#73)
  • A non-publishing npm run release:check gate that requires pre-reviewed
    package/changelog metadata and detects npm/tag/GitHub partial release state;
    the release path can safely resume after npm succeeds for the same exact
    gitHead (#73)
  • Hosted-compatible strict_match_org_only, org_match_field,
    org_match_mode, and purpose inputs on ctscout_search_company, plus
    protocol-level and packed-artifact contract tests (#75)
  • ctscout_search_company_batch tool — look up apex domains for up to 10
    organization names in one /scan/batch call. Per-company sections are
    fair-shared under the response character budget so one company's large
    result can't starve the others; partial failures render per-company (the
    207-style envelope), and JSON output is bounded the same way (#19)
  • Biome lint/format gate (npm run lint) and test-file type-checking
    (npm run typecheck via tsconfig.test.json), both enforced in CI (#46)
  • Vitest coverage gate in CI (#38)
  • Markdown-escaping guard test covering all table formatter paths (#39)
  • Unit tests for callScan (#29) and getApiKey (#24)
  • types field and a minimal exports map in package.json for library
    consumers of the exported formatter/API types (#50)

Changed

  • Migrated the stdio adapter from the monolithic MCP TypeScript SDK v1 to the
    v2 server package and Zod 4 so one factory can serve modern stateless
    discovery and legacy sessionful clients (#73)
  • Pinned the MCP v2 server transport to the exact reviewed 2.0.0 runtime and
    made the packed-artifact contract reject dependency-range or installed-runtime
    drift (#79)
  • Aligned the existing stdio ctscout_search_company_batch contract with
    hosted MCP: quota-debiting tools are read-only but non-idempotent, semantic
    candidates survive default Markdown, full/compact responses are preserved
    before truncation, and protocol tests pin ordered partial failures plus the
    1–10-name schema (#76)
  • Documented hosted MCP as the authoritative contract and qualified the
    then-current stdio-only batch compatibility exception (#75)
  • Compatibility boundary: Node floor raised from >=18 to >=20 in
    engines (18 is EOL since April 2025; CI has only ever tested 20) (#46)
  • SERVER_VERSION is read from package.json at runtime instead of a
    hardcoded string; packed-artifact verification smoke-checks the installed
    server's exact banner (#49, #73)
  • Removed stale benchmark scripts (scripts/benchmark.ts, benchmarks/)
    and the mitata dev dependency (#47)
  • Simplified truncateIfNeeded recursion/retry logic (#30)
  • Combined the markdown table formatters into one code path (#31)
  • Perf: avoid array allocations in topEvidenceLine fallback (#35) and
    evidence rendering (#28); precompute the User-Agent string (#20)
  • tests/symlink-boot.test.ts uses the ESM-native import.meta.url idiom
    instead of the Vitest-injected __dirname global (#6)

Fixed

  • isDirectlyExecuted guard now handles symlinked and extension-less
    argv[1] (npx / npm install -g boot regression) (#37)
  • Undefined table cells from missing fallback chains in Pro-tier rendering (#36)
  • Legal-entity search safely includes financial/insurance name variants (#32)
  • JSON-format tool output bounded to CHARACTER_LIMIT (#53)
  • Truncated renders preserve the original query and format hint context (#54)
  • Attribution wording in the lookup_domain schema and the config path
    shown in the getApiKey error (#55)
  • The caller-controlled query is now escaped through the cellSafe
    chokepoint in both places it was interpolated raw — the results heading
    and the legal-entity did-you-mean suggestions — so a newline in
    company_name can no longer inject markdown lines into the output (#50)

Security

  • Fetch redirects rejected (redirect: "error") so the API key can never
    be forwarded to another origin (#26)
  • Markdown injection fixed in table formatters (#27) and explainError (#23)
  • Raw API error bodies bounded before rendering in explainError (#56)