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.
Files changed (2) hide show
  1. package/package.json +20 -10
  2. 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.13",
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.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
- "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
@@ -32,7 +32,8 @@ const receipts = require("./receipts");
32
32
  // CCS Verifier Core (pure stdlib Node.js)
33
33
  // ---------------------------------------------------------------------------
34
34
 
35
- const CCS_VERSION = "1.2.13";
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: {