ccs-mcp-server 1.2.13 → 1.2.15
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/package.json +20 -10
- package/src/index.js +73 -1
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ccs-mcp-server",
|
|
3
|
-
"version": "1.2.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.2.15",
|
|
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
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
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
|
@@ -32,7 +32,8 @@ const receipts = require("./receipts");
|
|
|
32
32
|
// CCS Verifier Core (pure stdlib Node.js)
|
|
33
33
|
// ---------------------------------------------------------------------------
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
// Read from package.json so the reported version can never drift from the published one.
|
|
36
|
+
const CCS_VERSION = require("../package.json").version;
|
|
36
37
|
|
|
37
38
|
const DEFAULT_POLICY = {
|
|
38
39
|
mode: "block",
|
|
@@ -431,10 +432,31 @@ function verifyIntentBinding(intent, toolName, toolArgs, now = Date.now()) {
|
|
|
431
432
|
const PROTOCOL_VERSION = "2024-11-05";
|
|
432
433
|
const SERVER_INFO = { name: "ccs-runtime-evidence", version: CCS_VERSION, title: "CCS Runtime Evidence" };
|
|
433
434
|
|
|
435
|
+
// MCP tool annotations (spec 2024-11-05+). Hints describe the tool's real
|
|
436
|
+
// runtime behaviour so clients/registries can drive consent, UI gating and
|
|
437
|
+
// safety review. All five tools are local, pure verification/analysis
|
|
438
|
+
// operations: no network calls, no writes to caller-owned resources. The
|
|
439
|
+
// only filesystem activity in this process is one-time Ed25519 keypair
|
|
440
|
+
// provisioning under ~/.ccs at first sign (never overwrites existing keys),
|
|
441
|
+
// which is local bootstrap plumbing, not a tool effect on external state.
|
|
434
442
|
const TOOLS = [
|
|
435
443
|
{
|
|
436
444
|
name: "verify_tool_call",
|
|
445
|
+
title: "Verify tool call (CCS 7-dimension)",
|
|
437
446
|
description: "Verify an AI agent tool call against CCS 7 dimensions (Structure, Schema, Security, Identity, Integrity, Latency, Cost) plus semantic attack-chain analysis and math overflow detection. Returns verdict (allowed/denied) with detailed findings. DEFAULT MODE BLOCKS UNSAFE CALLS.",
|
|
447
|
+
// readOnly: pure local computation (regex/structural checks, hashing,
|
|
448
|
+
// Ed25519 signing of a returned object); mutates no external state.
|
|
449
|
+
// destructive: never deletes/overwrites anything.
|
|
450
|
+
// idempotent: verdict/dimensions are deterministic for given input+policy;
|
|
451
|
+
// safe to retry (only receipt id/timestamp differ, no side effects).
|
|
452
|
+
// openWorld: fully offline; stdio-local crypto, no network or external
|
|
453
|
+
// entities are contacted.
|
|
454
|
+
annotations: {
|
|
455
|
+
readOnlyHint: true,
|
|
456
|
+
destructiveHint: false,
|
|
457
|
+
idempotentHint: true,
|
|
458
|
+
openWorldHint: false,
|
|
459
|
+
},
|
|
438
460
|
inputSchema: {
|
|
439
461
|
type: "object",
|
|
440
462
|
properties: {
|
|
@@ -450,7 +472,22 @@ const TOOLS = [
|
|
|
450
472
|
},
|
|
451
473
|
{
|
|
452
474
|
name: "issue_evidence",
|
|
475
|
+
title: "Issue signed CCS evidence receipt",
|
|
453
476
|
description: "Issue a CCS evidence record for a tool call. Evidence is cryptographically bound (content_hash + evidence_hash), tamper-evident, independently verifiable. Issued for allowed AND denied calls.",
|
|
477
|
+
// readOnly: false — first call provisions a new Ed25519 keypair under
|
|
478
|
+
// ~/.ccs (persistent state write), which modifies the local environment;
|
|
479
|
+
// we mark this conservatively even though the write is one-time.
|
|
480
|
+
// destructive: false — keypair bootstrap never overwrites or deletes
|
|
481
|
+
// existing state; receipts are returned, never appended to a store.
|
|
482
|
+
// idempotent: false — each issuance carries a fresh receipt id and
|
|
483
|
+
// issued_at timestamp, so repeated calls produce distinct records.
|
|
484
|
+
// openWorld: false — offline signing, no network access.
|
|
485
|
+
annotations: {
|
|
486
|
+
readOnlyHint: false,
|
|
487
|
+
destructiveHint: false,
|
|
488
|
+
idempotentHint: false,
|
|
489
|
+
openWorldHint: false,
|
|
490
|
+
},
|
|
454
491
|
inputSchema: {
|
|
455
492
|
type: "object",
|
|
456
493
|
properties: {
|
|
@@ -465,7 +502,19 @@ const TOOLS = [
|
|
|
465
502
|
},
|
|
466
503
|
{
|
|
467
504
|
name: "audit_mcp_config",
|
|
505
|
+
title: "Audit MCP configuration for security risks",
|
|
468
506
|
description: "Audit an MCP client/server configuration JSON for security risks: plain HTTP, weak secrets, disabled TLS, missing commands. Returns structured issues with severity.",
|
|
507
|
+
// readOnly: purely static analysis of the passed-in config object;
|
|
508
|
+
// nothing is executed, connected to, or written.
|
|
509
|
+
// destructive: false. idempotent: same config -> identical report.
|
|
510
|
+
// openWorld: the server never fetches the configured URLs; it inspects
|
|
511
|
+
// the JSON text offline, so it is closed-world.
|
|
512
|
+
annotations: {
|
|
513
|
+
readOnlyHint: true,
|
|
514
|
+
destructiveHint: false,
|
|
515
|
+
idempotentHint: true,
|
|
516
|
+
openWorldHint: false,
|
|
517
|
+
},
|
|
469
518
|
inputSchema: {
|
|
470
519
|
type: "object",
|
|
471
520
|
properties: {
|
|
@@ -476,7 +525,18 @@ const TOOLS = [
|
|
|
476
525
|
},
|
|
477
526
|
{
|
|
478
527
|
name: "verify_intent_binding",
|
|
528
|
+
title: "Verify intent-to-arguments binding (L4)",
|
|
479
529
|
description: "Verify that actual tool call arguments match a declared intent with zero tolerance. Catches cross-model parameter drift (planner says amount=100, executor writes amount=10000). No LLM needed — pure deterministic comparison. Supports exact match, numeric tolerance, and regex pattern binding modes.",
|
|
530
|
+
// readOnly: deterministic field-by-field comparison + hashing + signing;
|
|
531
|
+
// returns the binding verdict without touching any resource.
|
|
532
|
+
// destructive: false. idempotent: deterministic verdict, safe to retry.
|
|
533
|
+
// openWorld: fully offline local crypto and comparison.
|
|
534
|
+
annotations: {
|
|
535
|
+
readOnlyHint: true,
|
|
536
|
+
destructiveHint: false,
|
|
537
|
+
idempotentHint: true,
|
|
538
|
+
openWorldHint: false,
|
|
539
|
+
},
|
|
480
540
|
inputSchema: {
|
|
481
541
|
type: "object",
|
|
482
542
|
properties: {
|
|
@@ -514,7 +574,19 @@ const TOOLS = [
|
|
|
514
574
|
},
|
|
515
575
|
{
|
|
516
576
|
name: "verify_receipt",
|
|
577
|
+
title: "Offline-verify a CCS signed receipt",
|
|
517
578
|
description: "Offline-verify a CCS Ed25519-signed receipt. Auditors call this with a receipt JSON produced by issue_evidence or verify_intent_binding; it checks the signature against the embedded signer_public_key and reports whether the body was tampered with. Optionally pin an expected signer public key (PEM string or sha256: fingerprint) to reject receipts from untrusted signers.",
|
|
579
|
+
// readOnly: cryptographic verification only (crypto.verify on in-memory
|
|
580
|
+
// data); no state change.
|
|
581
|
+
// destructive: false. idempotent: same receipt/pin -> same verdict.
|
|
582
|
+
// openWorld: explicitly offline verification; trusts only the embedded
|
|
583
|
+
// public key (or a caller-pinned key), fetches nothing.
|
|
584
|
+
annotations: {
|
|
585
|
+
readOnlyHint: true,
|
|
586
|
+
destructiveHint: false,
|
|
587
|
+
idempotentHint: true,
|
|
588
|
+
openWorldHint: false,
|
|
589
|
+
},
|
|
518
590
|
inputSchema: {
|
|
519
591
|
type: "object",
|
|
520
592
|
properties: {
|