Repository navigation
Releases: itcustomsolution/sam-gov-mcp
Release list
SAM.gov MCP 0.2.1
SAM.gov MCP 0.2.1 corrects long literal-backslash normalization and avoids redundant backslash-contraction comparisons without increasing the existing work limits. Fail-closed depth/work protections remain.
Validation: retained 160/160 implementation tests; Node 22, 24 and 26 PR checks passed in run 39966872029. The exact release archive also passed offline package-content/hash checks and a consumer import.
SHA-256 (itcustomsolution-sam-gov-mcp-0.2.1.tgz):
fdeac71634df6299ec77a996f74632441aecafb85b5ba8a1d9ed12dd3edf41c8
The npm publication is pending owner-controlled approval and independent registry verification. This GitHub release does not assert npm publication.
0.2.0
- Independent release review (2026-10-22), SAM-01: the key check also reads JSON short escapes (
\n,\t,\/,
\\,\") as escapes, written or decoded, so a key split by a literal backslash-and-letter in a value or an
error body is redacted. - SAM-02: reading a response body is bounded by chunk count (65,536) as well as bytes, yields to the event loop every
256 chunks so the deadline can fire on an endless stream of tiny chunks, and keeps one abort listener for the whole
read instead of one reaction per chunk. - SAM-03: a call whose cancellation signal is already aborted does not invoke the transport at all.
- Re-review of the fixes (SAM-04 to SAM-06): an abort that lands during the periodic yield is seen before the next
read starts; the chunk bound counts data chunks only, not the end of the stream; two-character short escapes are
not charged the per-escape work unit, so a value made of many of them is still returned. A string that still
decodes after 8 rounds (more than 256 literal backslashes) is blanked; README says so. - Live check (2026-10-22, real key, one day's sample): consecutive pages, a 100-record page, a notice lookup, an
unknown notice and an out-of-range page parsed as documented; no reply echoed the key. Observed: an unrecognized
key is answered with an empty HTTP 404, which this server reports as an empty result; README says so.
0.2.0-rc.6 (2026-10-17, candidate)
- R5-SAM-RES: checking a reply for the API key is bounded and stoppable. Everything after the body is read
(JSON parsing, format checks, transformation-aware redaction) runs in a worker thread with a 256 MB heap limit
that is terminated at the call's deadline or on cancellation; the deadline now covers the whole call. Before the
check, each string's NFKC growth is limited (4 times plus 256, all strings 2 times plus 65,536); the check itself
has a deterministic work budget (48 units per character plus 1,000,000; 32 per escape). Exceeding a limit is the
newRESPONSE_TOO_COMPLEX; nothing of the reply is returned. Redaction coverage is unchanged. - Cancellation:
searchandgetOpportunitytake{ signal }, the MCP tools pass the client's cancellation, and
a cancelled call is the newCANCELLED. SamGovClienttakes a fifth argument{ limits, workerUrl };redactDeeptakeslimits;checkReplyand
CHECK_LIMITSare exported.- Internal security review fixes (round 1): a key written with control characters for letters (shown as
\b,\f
in the output) is caught (also present in rc.5); network error text is cut to 16 KB before it is redacted in the main thread; each string costs a fixed 16
units; at most 2 checks run at once. - Internal security review fixes (round 2): the scan reads letters after decomposition (NFKD) so a combining mark
after a letter no longer hides it (also in rc.5; completed in the review of the final delta); a control character or lone surrogate is read in the same pass both as a separator
and as the letters JSON writes for it, replacing round 1's second scan and its extra cost; a record with an
integer-like property name is also read in JSON's output order; a check's slot is held until its thread exits. - Internal security review of the final delta: the reading with inserted characters removed deleted control
characters before they could be read as JSON escape letters (927 of 3,000 fuzzed strings that 4256cfb caught were
returned); a third reading keeps them. NFKC no longer merges a combining mark into an escape's last digit in the
stripped readings. The output-order reading covers values alone and names alone. On a 3,000-string differential fuzz
nothing 4256cfb caught is lost; on 3,600 encoded-key inputs 3,439 results equal rc.5's and 161 redact more, none is
refused. Newline-separated lists of percent-encoded URLs now exceed the default budget and are refused. server.json(MCP registry metadata) had stayed at 0.2.0-rc.2 through rc.3 to rc.5; it now matches the package
version, and a test keeps them equal.- Previously measured (r5, crafted 5 MB replies): about 10 s of CPU or about 1 GB of memory. Those shapes, scaled to
64 to 256 KB, are now refused within the budget; no 5 MB measurement was made for this candidate.
npm: @itcustomsolution/sam-gov-mcp@0.2.0 is published. Its registry tarball is byte-identical to the unchanged asset attached here, which remains the exact npm pack output of this tag.
79717bf9e366375368ac9a85b943ecf8610e1131dcdd6813b772417a480f2d7c ../dist/itcustomsolution-sam-gov-mcp-0.2.0.tgz