Skip to content

Releases: minghsuy/ctscout-mcp

v0.6.1

Choose a tag to compare

@minghsuy minghsuy released this 09 Sep 06:38
d542dd4

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 truncated and nullable free_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

Choose a tag to compare

@minghsuy minghsuy released this 08 Sep 04:49
33c4e0e

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_lei by name: the API's normalizer_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 a none under 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: the org_match_field description now states what
    normalized compares 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, &/and and
    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 /scan lookups 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 sends remaining_quota: null). A /scan 429 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.ts pins 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

Choose a tag to compare

@minghsuy minghsuy released this 07 Sep 04:05
7df7f0f

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 a CtscoutApi (the eight calls) and a CtscoutHost
    (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}/customers behind enumerate: true): the research
    product's entity and vendor objects, per ctscout-worker#336. Both are free
    and debit no quota. A name_match of "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 carry snapshot / snapshot_source with 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_KEY set — the request omits the X-API-Key header 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 the structuredContent are two renderings of one bounded
    record — same rows, same counts, one truncation_note — so neither half of a
    response can describe a list the other half does not show, and the API's own
    counts / capped are 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 the as_of / product_version /
    snapshot_dates provenance 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 /scan answers carry snapshot
    since the API's 2026-09-05 version, so snapshot_source is "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's ScoutResult rows, which bucketed a 0..1 confidence float into
    verified / likely / possible / low on the client, is removed along
    with its shape detection; /scan rows render through the warehouse table
    and a confidence_band appears only where the API reports one, in a
    deep-dive job result. The advertised /scan row 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

Choose a tag to compare

@minghsuy minghsuy released this 05 Sep 23:00
37bd395

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) and ctscout_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 /scan plus the worker-set snapshot,
    worker_version and signals_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)
  • outputSchema on 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) and snapshot_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_company description, 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 document match_type, candidates,
    org_match_strategy, empty_reason, and that first_seen/last_seen are
    warehouse observation times, not CT SCT times (#100)

v0.3.0

Choose a tag to compare

@minghsuy minghsuy released this 30 Jul 16:02
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)

v0.2.3 — Docs hygiene republish

Choose a tag to compare

@minghsuy minghsuy released this 14 May 07:06
36d83ea

Docs-only republish to flush the personal-email reference from the npm tarball.

What changed

  • README.md and LIMITATIONS.md swept to pro@ctscout.dev (Cloudflare Email Routing alias)
  • No API, tool, or behavior changes from 0.2.2

Companion cleanup

  • ctscout-mcp-server@0.2.2 unpublished (was within 72hr window)
  • ctscout-mcp-server@0.2.0 and 0.2.1 deprecated 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/mcp

Or the local-install fallback:

claude mcp add ctscout -s user \
  -e CTSCOUT_API_KEY=YOUR_KEY \
  -- npx -y ctscout-mcp-server

v0.2.2 — Hosted MCP endpoint as primary install

Choose a tag to compare

@minghsuy minghsuy released this 14 May 06:23
c77913e

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 /sse fallback note
  • src/index.ts file-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-server

v0.2.0

Choose a tag to compare

@minghsuy minghsuy released this 12 May 01:54
5d70191

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