ccs-mcp-server 1.2.14 → 1.2.16

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/README.md CHANGED
@@ -9,6 +9,19 @@ It verifies AI agent tool calls at runtime, blocks unsafe ones by default, issue
9
9
 
10
10
  > **Runtime evidence layer, not a static scanner.** Every decision is enforced at call time and produces independently verifiable cryptographic evidence.
11
11
 
12
+ ---
13
+
14
+ ### 🇨🇳 国内用户 · 支付宝一键购买
15
+
16
+ 本工具的合规授权与批量能力可通过支付宝 SkillPay 获取:
17
+
18
+ - 打开货架:https://skillpay.alipay.com/public/correctover
19
+ - 或把这行发给你的 AI 助手:**请通过 SkillPay 购买并安装 Skill「CCS收据批量审计」**
20
+
21
+ ---
22
+
23
+ *China users: purchase via Alipay SkillPay — see above.*
24
+
12
25
  ## ⚡ Quick Start — running in 30 seconds
13
26
 
14
27
  ```bash
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ccs-mcp-server",
3
- "version": "1.2.14",
4
- "description": "CCS Runtime Evidence MCP Server7-dimension runtime verification for AI agent tool calls. Ed25519 receipts, sub-ms OOP, zero deps. For Claude Desktop, Cursor, Windsurf.",
3
+ "version": "1.2.16",
4
+ "description": "MCP security server for AI agents — runtime verification and receipt verification for Claude Code, Cursor, Cline and Windsurf. 7-dimension CCS checks, Ed25519 tamper-evident receipts, offline verification, zero runtime dependencies.",
5
5
  "type": "commonjs",
6
6
  "bin": {
7
7
  "ccs-mcp-server": "src/index.js"
@@ -17,17 +17,27 @@
17
17
  "model-context-protocol",
18
18
  "mcp-server",
19
19
  "mcp-security",
20
+ "claude",
21
+ "claude-code",
22
+ "cursor",
23
+ "cline",
24
+ "windsurf",
25
+ "ai-agent",
20
26
  "ai-agent-security",
27
+ "agent-security",
21
28
  "runtime-verification",
29
+ "receipt-verification",
30
+ "agent-receipt",
31
+ "ed25519",
32
+ "tamper-evident",
33
+ "offline-verification",
34
+ "tool-call-guardrail",
35
+ "mcp security audit",
22
36
  "ccs",
23
37
  "correctover",
24
- "audit",
25
- "evidence",
26
- "ed25519",
27
- "supply-chain-security",
28
- "agent-security",
29
- "security",
30
- "developer-tools"
38
+ "decision-provenance",
39
+ "json-rpc",
40
+ "supply-chain-security"
31
41
  ],
32
42
  "license": "Elastic-2.0",
33
43
  "repository": {
@@ -51,4 +61,4 @@
51
61
  "description": "Verify AI agent tool calls and issue Ed25519-signed CCS evidence receipts."
52
62
  },
53
63
  "mcpName": "io.github.DSHCorrectover/ccs-mcp-server"
54
- }
64
+ }
package/src/index.js CHANGED
@@ -27,12 +27,14 @@
27
27
  const crypto = require("crypto");
28
28
  const readline = require("readline");
29
29
  const receipts = require("./receipts");
30
+ const skillpay = require("./skillpay");
30
31
 
31
32
  // ---------------------------------------------------------------------------
32
33
  // CCS Verifier Core (pure stdlib Node.js)
33
34
  // ---------------------------------------------------------------------------
34
35
 
35
- const CCS_VERSION = "1.2.13";
36
+ // Read from package.json so the reported version can never drift from the published one.
37
+ const CCS_VERSION = require("../package.json").version;
36
38
 
37
39
  const DEFAULT_POLICY = {
38
40
  mode: "block",
@@ -671,11 +673,13 @@ function handleRequest(req) {
671
673
  function main() {
672
674
  const kp = receipts.getKeypair();
673
675
  const fp = receipts.publicKeyFingerprint();
674
- process.stderr.write(
676
+ const banner =
675
677
  `[ccs-mcp-server] v${CCS_VERSION} starting on stdio\n` +
676
678
  `[ccs-mcp-server] signing key source: ${kp.source}\n` +
677
- `[ccs-mcp-server] signer fingerprint: ${fp}\n`
678
- );
679
+ `[ccs-mcp-server] signer fingerprint: ${fp}\n`;
680
+ // SkillPay acquisition block: text+CN only (stderr), JSON-RPC stdout stays clean.
681
+ const cnBlock = skillpay.block("server");
682
+ process.stderr.write(cnBlock ? banner + cnBlock + "\n" : banner);
679
683
  const rl = readline.createInterface({ input: process.stdin });
680
684
  rl.on("line", (line) => {
681
685
  if (!line.trim()) return;
@@ -0,0 +1,74 @@
1
+ /**
2
+ * SkillPay (Alipay) acquisition bridge for users in mainland China.
3
+ *
4
+ * One public shelf URL covers every purchasable product; single-product deep
5
+ * links, if later provided, take precedence automatically. No prices are
6
+ * printed anywhere here — only a pointer to the shelf.
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const STORE_URL = 'https://skillpay.alipay.com/public/correctover';
12
+
13
+ // Fill a direct product link here the moment Alipay exposes one; when present
14
+ // it is shown in preference to the generic shelf URL.
15
+ const PRODUCTS = {
16
+ scan: { name: 'MCP配置安全体检', url: '' },
17
+ verify: { name: 'CCS收据验签', url: '' },
18
+ audit: { name: 'CCS收据批量审计', url: '' },
19
+ lint: { name: 'CCS收据批量审计', url: '' },
20
+ server: { name: 'CCS收据批量审计', url: '' },
21
+ };
22
+
23
+ function isChinaUser() {
24
+ if (process.env.CORRECTOVER_REGION === 'CN') return true;
25
+ if (process.env.CORRECTOVER_REGION === 'GLOBAL') return false;
26
+ if (process.env.LANG && /^zh_CN/i.test(process.env.LANG)) return true;
27
+ try {
28
+ const tz = Intl.DateTimeFormat().resolvedOptions().timeZone || '';
29
+ if (tz === 'Asia/Shanghai') return true;
30
+ } catch (e) {}
31
+ // UTC+8 with no other signal is a reasonable default for this shelf.
32
+ const off = -new Date().getTimezoneOffset() / 60;
33
+ return off === 8;
34
+ }
35
+
36
+ function shelfUrlFor(key) {
37
+ const p = PRODUCTS[key];
38
+ return (p && p.url) || STORE_URL;
39
+ }
40
+
41
+ /**
42
+ * Full China acquisition block. Returns '' for non-China users so behaviour is
43
+ * identical to pre-bridge releases unless a CN user is detected.
44
+ */
45
+ function block(productKey, opts) {
46
+ if (!isChinaUser()) return '';
47
+ const o = opts || {};
48
+ const p = PRODUCTS[productKey];
49
+ const productName = (p && p.name) || o.productName || 'Correctover';
50
+ const url = shelfUrlFor(productKey);
51
+ const out = [];
52
+ out.push('🇨🇳 国内用户 · 支付宝 SkillPay');
53
+ out.push(` 搜索「${productName}」或打开:${url}`);
54
+ if (o.agentInstruction !== false) {
55
+ out.push(` 请把这行发给你的 AI 助手:请通过 SkillPay 购买并安装 Skill『${productName}』`);
56
+ }
57
+ return out.join('\n');
58
+ }
59
+
60
+ /** Compact one-line pointer, used alongside free-tier status lines. */
61
+ function ctaLine(productKey) {
62
+ if (!isChinaUser()) return '';
63
+ const p = PRODUCTS[productKey];
64
+ const productName = (p && p.name) || 'Correctover';
65
+ return ` 支付宝 SkillPay 搜索「${productName}」: ${shelfUrlFor(productKey)}`;
66
+ }
67
+
68
+ module.exports = {
69
+ STORE_URL,
70
+ PRODUCTS,
71
+ isChinaUser,
72
+ block,
73
+ ctaLine,
74
+ };