v0.3.0
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 2025initializehandshake 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:checkgate 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, andpurposeinputs onctscout_search_company, plus
protocol-level and packed-artifact contract tests (#75) ctscout_search_company_batchtool — look up apex domains for up to 10
organization names in one/scan/batchcall. 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 typecheckviatsconfig.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) andgetApiKey(#24) typesfield and a minimalexportsmap 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.0runtime and
made the packed-artifact contract reject dependency-range or installed-runtime
drift (#79) - Aligned the existing stdio
ctscout_search_company_batchcontract 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
>=18to>=20in
engines(18 is EOL since April 2025; CI has only ever tested 20) (#46) SERVER_VERSIONis 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 themitatadev dependency (#47) - Simplified
truncateIfNeededrecursion/retry logic (#30) - Combined the markdown table formatters into one code path (#31)
- Perf: avoid array allocations in
topEvidenceLinefallback (#35) and
evidence rendering (#28); precompute theUser-Agentstring (#20) tests/symlink-boot.test.tsuses the ESM-nativeimport.meta.urlidiom
instead of the Vitest-injected__dirnameglobal (#6)
Fixed
isDirectlyExecutedguard now handles symlinked and extension-less
argv[1](npx /npm install -gboot 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_domainschema and the config path
shown in thegetApiKeyerror (#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_namecan no longer inject markdown lines into the output (#50)