ccs-mcp-server 1.2.0 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,82 @@
1
+ Elastic License v2
2
+
3
+ Copyright (c) 2026 Correctover. All rights reserved.
4
+
5
+ ## Elastic License
6
+
7
+ ### Acceptance
8
+
9
+ By using the software, you agree to all of the terms and conditions below.
10
+
11
+ ### Copyright License
12
+
13
+ The licensor grants you a free of charge, non-exclusive, worldwide,
14
+ non-sublicensable, non-transferable, royalty-free license under its
15
+ copyright and database rights to: use, copy, distribute, make
16
+ available, and prepare derivative works of, the software; and
17
+ permit persons to whom the software is furnished to do the same;
18
+ in each case to provide services to your own internal users and to
19
+ third parties; all provided, however, that you and any such persons
20
+ do not (and have no right to):
21
+ 1. provide the software as a managed service to third parties;
22
+ or
23
+ 2. circumvent the capacity or functionality limits of any
24
+ commercial/enterprise features in the software, or unlock any
25
+ functionality locked by a license key; or
26
+ 3. remove or hide any software source code, functionality,
27
+ license terms, or other technical or legal restrictions
28
+ (including any copyright, trademark, or other proprietary
29
+ rights notices).
30
+
31
+ If use of the software is under a trial license or for evaluation
32
+ purposes, you may use the software only for evaluation and
33
+ non-production uses during the trial period.
34
+
35
+ ### Patent License
36
+
37
+ The licensor grants you a free of charge, non-exclusive,
38
+ non-sublicensable, non-transferable, royalty-free license under
39
+ its patent claims that are embodied in the software, to make,
40
+ have made, use, import, and otherwise transfer the software,
41
+ provided that you do not (and have no right to) provide the
42
+ software as a managed service to third parties. This license
43
+ terminates automatically when you commence patent action
44
+ concerning the software.
45
+
46
+ ### Trademark License
47
+
48
+ No permission is granted to use the trade names, trademarks,
49
+ service marks, or product names of the licensor or its contributors
50
+ except as required for reasonable and customary use in describing
51
+ and as necessary to comply with the notice and attribution
52
+ requirements above.
53
+
54
+ ### No Other Rights
55
+
56
+ The terms and conditions of this license do not grant any other
57
+ permission to the software or any other intellectual property.
58
+
59
+ ### No Warranty
60
+
61
+ The software is provided "as is" without warranty, to the maximum
62
+ extent permitted by law. The licensor disclaims and has no liability
63
+ of any kind for any and all warranties, conditions, and other terms
64
+ that would otherwise exist, including: merchantability, satisfactory
65
+ quality, fitness for a particular purpose, title, non-infringement,
66
+ or any warranties that the software is error-free or that any defects
67
+ will be corrected. The licensor disclaims and has no liability for
68
+ loss or damage to any data or information stored or processed
69
+ through the software. Nothing in this license applies to any
70
+ software that is not the software.
71
+
72
+ ### Limitation of Liability
73
+
74
+ To the maximum extent permitted by law, in no event shall the
75
+ licensor be liable for any direct, indirect, incidental, special,
76
+ punitive, or consequential damages, including damages for loss of
77
+ profits, goodwill, use, data, or other intangible losses, whether
78
+ based on warranty, contract, tort, or any other legal theory,
79
+ regardless of whether the licensor has been advised of the
80
+ possibility of such damages. If any court refuses to grant the
81
+ foregoing limitations, then liability shall be limited to the
82
+ greatest extent permitted by law.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ccs-mcp-server",
3
- "version": "1.2.0",
3
+ "version": "1.2.2",
4
4
  "description": "CCS Runtime Evidence MCP Server — verify AI agent tool calls, issue Ed25519-signed evidence receipts, audit MCP configs, and bind execution to declared intent (cross-model amount drift protection). For Claude Desktop, Cursor, Windsurf, and any MCP client.",
5
5
  "type": "commonjs",
6
6
  "bin": {
package/src/index.js CHANGED
@@ -32,7 +32,7 @@ const receipts = require("./receipts");
32
32
  // CCS Verifier Core (pure stdlib Node.js)
33
33
  // ---------------------------------------------------------------------------
34
34
 
35
- const CCS_VERSION = "1.2.0";
35
+ const CCS_VERSION = "1.2.2";
36
36
 
37
37
  const DEFAULT_POLICY = {
38
38
  mode: "block",
@@ -111,9 +111,12 @@ function deepMerge(base, override) {
111
111
  return result;
112
112
  }
113
113
 
114
- function canonical(obj) {
115
- return JSON.stringify(obj, Object.keys(obj).sort());
116
- }
114
+ // Use the receipt module's recursive canonical serializer. The previous
115
+ // JSON.stringify(obj, Object.keys(obj).sort()) implementation dropped all
116
+ // nested object fields because the top-level key array acts as a recursive
117
+ // whitelist; that made content/evidence hashes omit dimensions and other
118
+ // nested data. Fixed in 1.2.2.
119
+ const canonical = receipts.canonical;
117
120
 
118
121
  function sha256(s) {
119
122
  return "sha256:" + crypto.createHash("sha256").update(s).digest("hex");
package/src/receipts.js CHANGED
@@ -29,7 +29,24 @@ const ALG_INTERNAL = "ed25519";
29
29
  const SIGNATURE_FIELDS = ["signer_public_key", "signature_alg", "signature", "verified"];
30
30
 
31
31
  function canonical(obj) {
32
- return JSON.stringify(obj, Object.keys(obj).sort());
32
+ // Recursive JCS-style deterministic JSON: sort object keys at EVERY nesting
33
+ // level, preserve array order. NOTE: a previous implementation used
34
+ // JSON.stringify(obj, Object.keys(obj).sort()) which applies the top-level
35
+ // key list as a recursive whitelist and silently drops all nested fields
36
+ // from the serialized output — meaning signatures/hashes did not cover
37
+ // dimensions, semantic_analysis, etc. That was a security bug fixed in
38
+ // 1.2.2. Receipts issued by <=1.2.1 do not cover nested fields and must be
39
+ // re-issued.
40
+ if (Array.isArray(obj)) {
41
+ return "[" + obj.map(canonical).join(",") + "]";
42
+ }
43
+ if (obj !== null && typeof obj === "object") {
44
+ const keys = Object.keys(obj).sort();
45
+ return "{" + keys
46
+ .map((k) => JSON.stringify(k) + ":" + canonical(obj[k]))
47
+ .join(",") + "}";
48
+ }
49
+ return JSON.stringify(obj);
33
50
  }
34
51
 
35
52
  function defaultKeyDir() {