Releases: minghsuy/ctscout-mcp
Release list
v0.6.1
What's changed in v0.6.1
npm: npm install ctscout-mcp-server@0.6.1 or npx ctscout-mcp-server@0.6.1
Fixed
- Preserve the vendor enumeration's API
truncatedand nullablefree_slice
in its schema, JSON, Markdown explanation and smallest overflow envelope.
Free keys get up to 100 rows per list; Pro gets the published lists, subject
to separate export and MCP size caps. The summary no longer promises a full
enumeration to every key (#72; hosted adoption: ctscout-worker#391). - Scan tool quota descriptions explicitly count successful lookups.
- Update the Vitest 4 patch dependencies to remove the mocker development-tool advisory.
v0.6.0
What's changed in v0.6.0
npm: npm install ctscout-mcp-server@0.6.0 or npx ctscout-mcp-server@0.6.0
Added
-
Every tool description ends with a "Corrections" line, and every API 4xx
about the answer (400, 404, an unmapped status) ends with the same
sentence: a wrong attribution is an issue on the package's tracker, a
missing entity an email to pro@ctscout.dev, with the query, the result and
why it is wrong. The path itself is unchanged (LIMITATIONS "Corrections and
contact"); it is now in-band, where an agent that got a wrong answer reads.
Key and quota refusals (401, 403, 429), 5xx and timeouts do not carry it:
they already say what to do (#102). -
ctscout_lookup_leiby name: the API'snormalizer_mismatch(null, or the
{ index, lookup }normalizer versions when the index was keyed by one this
API does not reproduce) is now in the output schema, rendered as one line
above the markdown result — so anoneunder a drifted index reads as a
possible spelling miss, not a true miss — and kept by the overflow envelope.
The JSON path already passed it through.
Changed
-
ctscout_search_company: theorg_match_fielddescription now states what
normalizedcompares since the API moved it to the research normalizer
(X-API-Version: 2026-09-07): the normalizer's key of the query against the
normalized column, with legal forms stripped at the edges,&/andand
hyphen/space unified, a leading "The" dropped and a generic tail such as
"Holdings" kept. It used to promise the locale normalizer. -
Pro is described as it is sold: 3,000
/scanlookups a month for $49,
subscribed through Stripe from https://ctscout.dev/#tiers, with the key
sent by email. The "unlimited" and "concierge-only" wording is gone from
the README, LIMITATIONS, the tool descriptions, the 429 and 403 texts and
the batch quota footer (which now says the count is not reported for the key when
the API sendsremaining_quota: null). A/scan429 quotes the API's own
detail— which cap, and when it resets — instead of assuming the free
daily quota, since a Pro key meets one too. The README tiers table mirrors
the product page row for row and the Pro example table is the renderer's
verbatim output;tests/docs-claims.test.tspins those and the transport
parity exception, the confirmed-vendor definition's two paths, the caps and
quotas, the npm scripts and the handshake example to the code (#116).
v0.5.0
What's changed in v0.5.0
npm: npm install ctscout-mcp-server@0.5.0 or npx ctscout-mcp-server@0.5.0
Added
ctscout-mcp-server/contract: the transport-free tool contract — every
name, description, schema, annotation and renderer, and
registerCtscoutTools(server, api, host)— cut out of the stdio host so the
hosted MCP in ctscout-worker registers from the same module (#72, step
one). A host supplies aCtscoutApi(the eight calls) and aCtscoutHost
(where its caller puts the API key, in that caller's terms, and whether it
holds one), so no sentence in the contract names a transport. The root entry
re-exports the contract; nothing importing this package changes.ctscout_lookup_lei(GET /lei/{lei},GET /lei?name=) and
ctscout_vendor_customers(GET /vendors/{slug}, and the keyed
GET /vendors/{slug}/customersbehindenumerate: true): the research
product's entity and vendor objects, per ctscout-worker#336. Both are free
and debit no quota. Aname_matchof"none"is explained as a spelling
miss against the index's normalizer, never as "this company has no LEI";
candidate and confirmed customer counts are rendered as two separate claims
and never summed, since confirmed is the DNS-confirmed subset of candidates.
Both carrysnapshot/snapshot_sourcewith their own source vocabulary,
"product" | "unavailable"— the date is the research export's version, not
the daily warehouse sync, so calling it"scan"would misname both its
origin and its cadence. Before the first publish the routes answer HTTP 503
and the tools return a plain "not published yet" error rather than a server
outage. The free routes are unauthenticated, so both work with no
CTSCOUT_API_KEYset — the request omits theX-API-Keyheader rather than
sending an empty one, and the server no longer exits at boot when the variable
is unset (it warns and names the tools that still work).enumerate: true
still requires a key and says so without a round-trip. In the customer
enumeration, where the payload IS the rows, the
markdown and thestructuredContentare two renderings of one bounded
record — same rows, same counts, onetruncation_note— so neither half of a
response can describe a list the other half does not show, and the API's own
counts/cappedare left untouched. Every rendered list says how many
entries it left out and how many there were in all. Every product answer
collapses through one spec-driven envelope that knows, per field, whether a
list is a declared sample or published complete, names any list it shortens
with the length the API sent, and preserves theas_of/product_version/
snapshot_datesprovenance the tool contract promises on every answer — so a
fallback cannot silently shorten a complete list or drop the per-source
provenance, for any object kind present or future. A
503 is read from its body: only the Worker's "not yet published" detail gets
the wait-for-the-refresh guidance, and any other 503 is reported as a
temporary availability failure rather than a permanent state. The hosted MCP in ctscout-worker does
not advertise these two tools yet; mirroring them there is a separate Worker
change (#103)
Changed
- Docs and tool descriptions say the warehouse syncs daily (it has since
2026-05-16; "weekly" was stale) and that/scananswers carrysnapshot
since the API's 2026-09-05 version, sosnapshot_sourceis"scan"on the
scan tools rather than always"unavailable"(ctscout-worker#343) - The package never invents a confidence band. The renderer for the retired
origin'sScoutResultrows, which bucketed a 0..1confidencefloat into
verified/likely/possible/lowon the client, is removed along
with its shape detection;/scanrows render through the warehouse table
and aconfidence_bandappears only where the API reports one, in a
deep-dive job result. The advertised/scanrow schema drops the four
fields only that shape carried (confidence,sources,cert_org_names,
rdap_org); the row stays an open object, so a payload carrying them
still validates (#99) - README and LIMITATIONS describe what a Pro key gets today: more
/scan
rows and a longer window on the same daily snapshot, and evidence-backed
confidence_bands only through deep-dive jobs; no live enrichment on
/scan, no VLM (ctscout-worker#338)
v0.4.0
What's changed in v0.4.0
npm: npm install ctscout-mcp-server@0.4.0 or npx ctscout-mcp-server@0.4.0
Added
ctscout_submit_deep_dive(POST /jobs) andctscout_get_job
(GET /jobs/{id}): asynchronous Pro deep dives per ctscout-worker#344
contract v1. Submit returns a receipt; poll with backoff (30 s → 5 min) for
a result identical to a Pro/scanplus the worker-setsnapshot,
worker_versionandsignals_attempted. VLM is not part of v1. Job
errors map 403 → Pro required (with the API's upgrade text), 404 → not
your job / unknown id, 429 → daily jobs quota (#107)outputSchemaon all three tools, enforced by the SDK against every
structuredContent; proxied fields stay open so upstream additions widen
rather than break the tool (#100)snapshot(warehouse/D1 sync date) andsnapshot_source(scan|
unavailable) on every response, read from the API payload when it carries
one; no independent fallback request, so a missing date is reported as
unknown rather than guessed. Markdown output carries the same line (#100)
Changed
ctscout_search_companydescription, README and LIMITATIONS no longer carry a
hand-typed warehouse size (the three disagreed with each other and with the
live site); all point at https://ctscout.dev/stats instead (#101)- Result wording is consistently "attributed" (cert-subject attribution) vs
"candidate" (semantic name similarity, not an attribution); every table's
organization column is "Attributed to" and the candidate table is labelled
as candidates. Tool descriptions documentmatch_type,candidates,
org_match_strategy,empty_reason, and thatfirst_seen/last_seenare
warehouse observation times, not CT SCT times (#100)
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)
Security
v0.2.3 — Docs hygiene republish
Docs-only republish to flush the personal-email reference from the npm tarball.
What changed
README.mdandLIMITATIONS.mdswept topro@ctscout.dev(Cloudflare Email Routing alias)- No API, tool, or behavior changes from 0.2.2
Companion cleanup
ctscout-mcp-server@0.2.2unpublished (was within 72hr window)ctscout-mcp-server@0.2.0and0.2.1deprecated with "upgrade to 0.2.3+" guidance
Hosted endpoint (unchanged)
claude mcp add ctscout -s user --transport http \
--header "X-API-Key: YOUR_KEY" \
https://ctscout.dev/mcpOr the local-install fallback:
claude mcp add ctscout -s user \
-e CTSCOUT_API_KEY=YOUR_KEY \
-- npx -y ctscout-mcp-serverv0.2.2 — Hosted MCP endpoint as primary install
Hosted endpoint at https://ctscout.dev/mcp (Streamable HTTP) and https://ctscout.dev/sse (legacy SSE). Same two tools, zero local install. Auth via X-API-Key header (or Authorization: Bearer …).
Docs-only release — no API or tool-handler changes from 0.2.1. The npm package itself still works exactly as before; the README now leads with the hosted path and treats the npx install as a fallback for restricted-network users.
What changed
- README restructured: "2a. Hosted endpoint (recommended)" + "2b. Local npm (fallback)"
- Added Claude Desktop HTTP-transport caveat and Cursor
/ssefallback note src/index.tsfile-level comment now reflects both transports- Bumped SERVER_VERSION + package.json to 0.2.2
Install
# Hosted (recommended)
claude mcp add ctscout -s user --transport http \
--header "X-API-Key: YOUR_KEY" \
https://ctscout.dev/mcp
# Or self-host (npm path, unchanged)
claude mcp add ctscout -s user \
-e CTSCOUT_API_KEY=YOUR_KEY \
-- npx -y ctscout-mcp-serverv0.2.0
What's Changed
- docs: clarify Claude Code CLI vs Claude Desktop config gotcha by @minghsuy in #1
- Add Claude Code GitHub Workflow by @minghsuy in #3
- v0.2.0: surface Pro-tier confidence_band + evidence, add Vitest by @minghsuy in #2
- Add scripts/release.sh for npm releases by @minghsuy in #4
New Contributors
Full Changelog: https://github.com/minghsuy/ctscout-mcp/commits/v0.2.0