@systemores/systemores-plugin 1.1.4 → 1.2.0

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.
@@ -6,13 +6,13 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "Official Systemores AI Agent Psychometrics, Inline Circuit-Breaker, and MCP 2026 Security Governance plugin catalog.",
9
- "version": "1.1.4"
9
+ "version": "1.2.0"
10
10
  },
11
11
  "plugins": [
12
12
  {
13
13
  "name": "systemores",
14
14
  "description": "Catch tool privilege escalation, sycophancy, and multi-turn persona drift before production. Combines free static MCP 2026 schema & delegation graph audits with <250ms Systemores System One inline circuit breaking, 21-dimension psychometric stress tests, and EU AI Act / NIST / SOC 2 compliance dossiers.",
15
- "version": "1.1.4",
15
+ "version": "1.2.0",
16
16
  "author": {
17
17
  "name": "Systemores LLC",
18
18
  "url": "https://audit.systemores.com"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "systemores",
3
- "version": "1.1.4",
3
+ "version": "1.2.0",
4
4
  "description": "Audit AI agents, system prompts, and MCP tools across the Systemores 21-dimension & IPIP-NEO-120 psychometric framework, with sub-300ms inline circuit breaking and EU AI Act / NIST / SOC 2 compliance dossiers.",
5
5
  "author": {
6
6
  "name": "Systemores",
package/PRIVACY.md CHANGED
@@ -22,7 +22,7 @@ Systemores LLC ("Systemores", "we", "our") provides the **Systemores AI Agent &
22
22
  ### Pro & Team Cloud Tiers (Psychometric, Live Circuit-Breaker & Compliance Tools)
23
23
  - Tools: `systemores_stress_test_agent`, `systemores_evaluate_drift`, `systemores_assess_bias`, `systemores_tool_integrity`, `systemores_generate_cohort`, `systemores_inject_environment_fault`, `systemores_analyze_trace_telemetry`, `systemores_export_dossier`, `systemores_audit_turn_live`
24
24
  - **Authentication & Licensing Metadata:** We store a SHA-256 digest of your API key, subscription tier (`pro`, `team`, `enterprise`), billing status via Stripe, aggregate monthly call counts, Trial Token TTL/quotas, and a rolling 24-hour set of distinct client IPs to enforce seat licensing.
25
- - **Zero-Retention Compliance Certificate Metadata (`/verify/dos-...`):** Solely when a Team subscriber explicitly invokes `systemores_export_dossier`, Systemores stores sanitized certificate metadata (`dossierId`, sanitized `companyName`, `auditSessionId`, `frameworksEvaluated`, numeric `frameworkScores`, `overallScore`, `certificationStatus`, `engineVersion`, `timestamp`, `sha256IntegrityHash`, and HMAC signature) in Upstash Redis for a 365-day TTL. Raw system prompts, user messages, agent outputs, and tool schemas are **never** persisted in dossier records.
25
+ - **Zero-Retention Compliance Certificate Metadata (`/verify/dos-...`):** Solely when a Team subscriber explicitly invokes `systemores_export_dossier`, Systemores stores sanitized certificate metadata (`dossierId`, sanitized `companyName`, `auditSessionId`, `frameworksEvaluated`, numeric `frameworkScores`, `overallScore`, `certificationStatus`, optional `locale`, `engineVersion`, `timestamp`, `sha256IntegrityHash`, and HMAC signature) in Upstash Redis for a 365-day TTL. Transient evidence inputs passed for dynamic scoring (`systemPrompt`, `toolDefinitionsJson`, `graphTopologyJson`, `otelTraceJson`, `liveAuditMetricsJson`), user messages, and agent outputs are evaluated strictly in memory and **never** persisted in dossier records.
26
26
 
27
27
  ## 3. Third-Party Subprocessors
28
28
 
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  **Stop shipping unverified prompts and over-privileged MCP tools. Audit schemas, delegation graphs, 21-dimension behavioral stability, and `<250ms` inline circuit breakers directly inside your IDE.**
4
4
 
5
- [![Version](https://img.shields.io/badge/version-1.1.4-0ea5e9.svg)](https://audit.systemores.com)
5
+ [![Version](https://img.shields.io/badge/version-1.2.0-0ea5e9.svg)](https://audit.systemores.com)
6
6
  [![npm](https://img.shields.io/npm/v/@systemores/systemores-plugin?color=cb3837&label=npm)](https://www.npmjs.com/package/@systemores/systemores-plugin)
7
7
  [![MCP Registry](https://img.shields.io/badge/MCP_Registry-io.github.bobcar0%2Fsystemores--plugin-0ea5e9)](https://registry.modelcontextprotocol.io)
8
8
  [![MCP 2026](https://img.shields.io/badge/MCP-2026%20Streamable%20HTTP-10b981.svg)](https://audit.systemores.com/api/mcp)
@@ -50,6 +50,16 @@
50
50
  | **Audit Workflow Skill** | `skills/systemores-audit/SKILL.md` | On-demand procedural runbook for 12 MCP tools, scorecards, and compliance certification. |
51
51
  | **Governance Rules** | `rules/AGENTS.md` | Enforces MCP 2026 `annotations` (`readOnlyHint`, `destructiveHint`) and anti-sycophancy guardrails. |
52
52
 
53
+ *✨ Tip: Look for the M8ven Verified badge & live MCP Registry listing across OpenAPI, Smithery & Antigravity.*
54
+
55
+ ---
56
+
57
+ ## 🌍 Multilingual Auditing & Dynamic Zero-Retention Dossiers (`v1.2.0`)
58
+
59
+ - **7-Locale Prompt & Schema Auditing (`en`, `es`, `de`, `fr`, `pt`, `ja`, `zh` + BCP-47 tags like `pt-BR`, `zh-CN`):** Prompt stress testing, CJK-weighted MCP tool description scoring (`systemores_audit_tool_integrity`), cross-cultural Needs-Press calibration, and the 5th bias framework **`eu_ai_act`** (`EU 2024/1689`) evaluate native non-English agents directly.
60
+ - **Localized Cohorts & Verification Cards:** Pass `locale` to `systemores_generate_cohort` and `systemores_export_dossier`, and preview any certificate card in 7 languages via `/verify/dos-...?lang=de` (`ja`, `es`, `fr`, `pt`, `zh`) with invariant SHA-256 integrity hashes.
61
+ - **Dynamic Evidence-Driven Dossier Scoring:** Pass optional transient `systemPrompt`, `role`, `toolDefinitionsJson`, `graphTopologyJson`, `otelTraceJson`, and/or `liveAuditMetricsJson` to `systemores_export_dossier` to compute differentiated per-framework scores (`CERTIFIED`, `CONDITIONAL_APPROVAL`, `NON_COMPLIANT`) strictly in memory (`zeroRetentionVerified: true`).
62
+
53
63
  ---
54
64
 
55
65
  ## 🚀 Quick Install
@@ -96,8 +106,8 @@ The Systemores Cloud MCP Server (`https://audit.systemores.com/api/mcp`) provide
96
106
  | `systemores_stress_test_agent` *(21-Dimension Murray Needs-Press + Big Five/MBTI/DISC)* | 🔒 Pro / Trial Key | ✅ Live 21-Trait Engine | ✅ Unredacted Raw Vectors |
97
107
  | `systemores_tool_integrity` *(Action Boundary & Privilege Escalation Audit)* | 🔒 Pro / Trial Key | ✅ Live Compliance Score | ✅ Full Risk Breakdown |
98
108
  | `systemores_evaluate_drift` *(Multi-Turn Persona Erosion & Entropy Curve)* | 🔒 Pro / Trial Key | ✅ Up to 100 Turns | ✅ Up to 100 Turns |
99
- | `systemores_assess_bias` *(EEOC, ECOA, Fair Housing & COPPA Bias Audit)* | 🔒 Pro / Trial Key | ✅ All 4 Domains | ✅ All 4 Domains |
100
- | `systemores_generate_cohort` *(30-Facet IPIP-NEO-120 Synthetic Adversarial Cohorts)* | 🔒 Pro / Trial Key | ✅ Up to 50 Personas | ✅ Custom Domain Cohorts |
109
+ | `systemores_assess_bias` *(EEOC, ECOA, Fair Housing, COPPA & EU AI Act Bias Audit)* | 🔒 Pro / Trial Key | ✅ All 5 Domains | ✅ All 5 Domains |
110
+ | `systemores_generate_cohort` *(30-Facet IPIP-NEO-120 Synthetic Adversarial Cohorts)* | 🔒 Pro / Trial Key | ✅ Up to 100 Personas | ✅ Custom Domain Cohorts |
101
111
  | `systemores_inject_environment_fault` *(Chaos Engineering Fault Generator)* | 🔒 Pro / Trial Key | ✅ All Fault Profiles | ✅ All Fault Profiles |
102
112
  | `systemores_analyze_trace_telemetry` *(OpenTelemetry Span & Cost Burn Trap Audit)* | 🔒 Pro / Team Key | ✅ W3C Trace Context | ✅ Full OTel Ingestion |
103
113
  | `systemores_export_dossier` *(EU AI Act, NIST AI RMF 1.0 & SOC 2 Certification Dossier)* | 🔒 Team Key | 🔒 Team Key | ✅ Audit-Ready Dossier Suite |
@@ -53,8 +53,8 @@ Always execute audits starting with zero-friction structural checks before invok
53
53
 
54
54
  ### Phase 1: Instant Structural & Topology Audit (Free Community Tier)
55
55
  1. **MCP Tool Schema & Annotation Audit (`systemores_audit_tool_integrity`)**:
56
- - Inspect the workspace's MCP tool definitions (`tools.ts`, `mcp_config.json`, or tool schemas).
57
- - Run `systemores_audit_tool_integrity` with `strictMode: true` to flag injection vectors, privilege overreach, missing `integer` vs. `number` constraints, and deceptive MCP 2026 `annotations` (`readOnlyHint`, `destructiveHint`, `idempotentHint`, `openWorldHint`).
56
+ - Inspect the workspace's MCP tool definitions (`tools.ts`, `mcp_config.json`, or tool schemas), including multilingual & CJK tool descriptions (`en`, `es`, `de`, `fr`, `pt`, `ja`, `zh`).
57
+ - Run `systemores_audit_tool_integrity` with `strictMode: true` to flag multilingual injection vectors, privilege overreach, missing `integer` vs. `number` constraints, and deceptive MCP 2026 `annotations` (`readOnlyHint`, `destructiveHint`, `idempotentHint`, `openWorldHint`), using CJK-weighted semantic description checks.
58
58
  2. **Multi-Agent Graph Topology Audit (`systemores_audit_agent_graph`)**:
59
59
  - Verify delegation graphs for cyclic deadlocks and `public -> admin` privilege escalation paths.
60
60
  3. **Cognitive Drag & Token Efficiency (`systemores_measure_drag`)**:
@@ -62,11 +62,11 @@ Always execute audits starting with zero-friction structural checks before invok
62
62
 
63
63
  ### Phase 2: Live Psychometric Stress Testing & Compliance (Pro / Team / Trial Tier)
64
64
  4. **System One Live Turn Circuit Breaker (`systemores_audit_turn_live`)**:
65
- - Test adversarial user turns and proposed tool calls to compute the **Systemores Health Index (0–100)**, sycophancy probability, and circuit-breaker verdict.
65
+ - Test adversarial user turns (including cross-lingual prompt-injection bypasses and polite/direct cultural registers) and proposed tool calls to compute the **Systemores Health Index (0–100)**, sycophancy probability, and circuit-breaker verdict.
66
66
  5. **Murray Needs-Press & Drift Audit (`systemores_stress_test_agent`, `systemores_evaluate_drift`, `systemores_assess_bias`)**:
67
- - Evaluate the agent's system prompt under high adversarial press and across EEOC/ECOA/COPPA compliance domains.
67
+ - Evaluate multilingual agent system prompts (`en`, `es`, `de`, `fr`, `pt`, `ja`, `zh`) with cross-cultural calibration under high adversarial press and across EEOC, ECOA, COPPA, and **EU AI Act (`eu_ai_act`)** compliance domains.
68
68
  6. **Synthetic Cohorts & Regulatory Dossiers (`systemores_generate_cohort`, `systemores_export_dossier`)**:
69
- - Generate 30-facet IPIP-NEO-120 adversarial test cohorts (Pro / Team) and export signed EU AI Act / NIST AI RMF 1.0 / SOC 2 compliance dossiers (`systemores_export_dossier` requires the **Team & Compliance ($199/mo)** or Enterprise tier).
69
+ - Generate 30-facet IPIP-NEO-120 adversarial test cohorts (Pro / Team) and export signed EU AI Act / NIST AI RMF 1.0 / SOC 2 compliance dossiers (`systemores_export_dossier` requires the **Team & Compliance ($199/mo)** or Enterprise tier), passing optional `locale` (`en`, `es`, `de`, `fr`, `pt`, `ja`, `zh`; BCP-47 tags like `pt-BR` or `zh-CN` normalized automatically) for localized deliverables and `?lang=` verification pages. To compute differentiated, evidence-backed per-framework scores (`CERTIFIED`, `CONDITIONAL_APPROVAL`, or `NON_COMPLIANT`) under strict zero-retention, pass transient `systemPrompt`, `role`, `toolDefinitionsJson`, `graphTopologyJson`, `otelTraceJson`, and/or `liveAuditMetricsJson` (`healthIndex`, `sycophancyProbability`, `personaStabilityIndex`, `averageDriftIndex`, `toolIntegrityScore`).
70
70
 
71
71
  > **Handling Unauthenticated / Free-Tier Responses Gracefully:**
72
72
  > If a Pro/Enterprise tool returns an authentication prompt from the Cloud MCP server, still deliver a complete **Phase 1 Structural & Static Prompt Audit Scorecard** using the Free Tier tools (`systemores_audit_tool_integrity`, `systemores_audit_agent_graph`, `systemores_measure_drag`), and clearly show the user how to unlock live 21-dimension psychometric scoring and System One inline circuit breaking by adding a Trial Token or Pro API key (`sys_pro_...`) from `https://audit.systemores.com/pricing`.
@@ -90,7 +90,7 @@ Always execute audits starting with zero-friction structural checks before invok
90
90
  **Systemores Health Index:** `XX.X / 100` | **Circuit Breaker Gate:** `[DISPATCH | INTERCEPT | STRIP_TOOL | QUARANTINE]`
91
91
 
92
92
  ### 🛡️ MCP Tool & Graph Integrity Summary
93
- - **Tools Audited:** `X` | **Integrity Score:** `XX / 100` (`[PASS | WARN | FAIL]`)
93
+ - **Tools Audited:** `X` | **Integrity Score:** `XX / 100` (`[PASS | REVIEW | FAIL]`)
94
94
  - **Annotation Mismatches / Injection Flags:** `<summary>`
95
95
  - **Agent Graph Topology:** `[PASSED | FAILED]`
96
96
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "systemores",
3
- "version": "1.1.4",
3
+ "version": "1.2.0",
4
4
  "description": "Systemores AI Agent Auditor — 21-dimension behavioral stress testing, IPIP-NEO-120 psychometrics, MCP 2026 tool integrity auditing, and regulatory compliance dossiers.",
5
5
  "mcpServers": {
6
6
  "cloud": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@systemores/systemores-plugin",
3
- "version": "1.1.4",
3
+ "version": "1.2.0",
4
4
  "mcpName": "io.github.bobcar0/systemores-plugin",
5
5
  "description": "Systemores AI Agent Psychometrics, Inline Circuit-Breaker (<250ms), and MCP 2026 Security Governance plugin for Google Antigravity, Claude Code, and Gemini CLI.",
6
6
  "homepage": "https://audit.systemores.com",
package/plugin.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://antigravity.google/schemas/v1/plugin.json",
3
3
  "name": "systemores",
4
4
  "displayName": "Systemores",
5
- "version": "1.1.4",
5
+ "version": "1.2.0",
6
6
  "description": "Audit AI agent system prompts, MCP 2026 tool schemas, delegation graphs, <250ms guardrails, 21D psychometrics, and EU AI Act / NIST / SOC 2 dossiers.",
7
7
  "logo": "assets/logo.svg",
8
8
  "suggestedPrompts": [
package/server.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "title": "Systemores AI Agent & MCP Security Auditor",
5
5
  "description": "AI agent security, MCP 2026 schema & graph audits, <250ms guardrails, and compliance dossiers",
6
6
  "websiteUrl": "https://audit.systemores.com",
7
- "version": "1.1.4",
7
+ "version": "1.2.0",
8
8
  "icons": [
9
9
  {
10
10
  "src": "https://raw.githubusercontent.com/bobcar0/systemores-plugin/main/assets/logo.svg",
@@ -23,7 +23,7 @@
23
23
  "registryType": "npm",
24
24
  "registryBaseUrl": "https://registry.npmjs.org",
25
25
  "identifier": "@systemores/systemores-plugin",
26
- "version": "1.1.4",
26
+ "version": "1.2.0",
27
27
  "transport": {
28
28
  "type": "stdio"
29
29
  },
@@ -25,12 +25,12 @@ These tools run live 30-adjective semantic extraction, Systemores 21-dimension s
25
25
 
26
26
  | Tool Name | Purpose | Key Parameters |
27
27
  | :--- | :--- | :--- |
28
- | `systemores_audit_turn_live` | **Systemores System One** real-time (~250ms) circuit breaker. Returns `healthIndex` (0–100), calibrated sycophancy probability, information leakage verdict, and gate action (`DISPATCH`, `INTERCEPT`, `STRIP_TOOL`, `QUARANTINE`). | `systemPrompt`, `userMessage`, `agentResponse`, `proposedToolCall` |
29
- | `systemores_stress_test_agent` | **Murray Needs-Press** adversarial stress test across 21 traits + derived Big Five (OCEAN), MBTI, and DISC profiles. | `systemPrompt`, `role` (`customer_support`, `financial_underwriter`, `medical_assistant`, `general_developer`), `pressIntensity` |
30
- | `systemores_tool_integrity` | Audits agent tool permissions, action boundaries, and privilege escalation risks in context. | `systemPrompt`, `toolContext` (`["api_calls", "database", "filesystem", "code_execution"]`) |
28
+ | `systemores_audit_turn_live` | **Systemores System One** real-time (~250ms) circuit breaker (supports cross-lingual bypasses & polite/direct cultural registers). Returns `healthIndex` (0–100), calibrated sycophancy probability, information leakage verdict, and gate action (`DISPATCH`, `INTERCEPT`, `STRIP_TOOL`, `QUARANTINE`). | `systemPrompt`, `userMessage`, `agentResponse`, `proposedToolCall` |
29
+ | `systemores_stress_test_agent` | **Murray Needs-Press** adversarial stress test across 21 traits + derived Big Five (OCEAN), MBTI, and DISC profiles across multilingual prompts (`en`, `es`, `de`, `fr`, `pt`, `ja`, `zh`). | `systemPrompt`, `role` (`customer_support`, `financial_underwriter`, `medical_assistant`, `general_developer`), `pressIntensity` |
30
+ | `systemores_tool_integrity` | Audits agent tool permissions, action boundaries, and privilege escalation risks in context (with multilingual & CJK-aware semantic description scoring). | `systemPrompt`, `toolContext` (`["api_calls", "database", "filesystem", "code_execution"]`) |
31
31
  | `systemores_evaluate_drift` | Simulates multi-turn persona erosion and computes average drift index and deviation angle in degrees. | `systemPrompt`, `turns` (1–100), `temperature` |
32
- | `systemores_assess_bias` | Evaluates algorithmic bias and regulatory non-compliance flags across protected domains. | `systemPrompt`, `complianceDomain` (`employment_eeoc`, `housing_fair`, `lending_ecoa`, `children_coppa`) |
33
- | `systemores_generate_cohort` | Generates synthetic adversarial & baseline testing personas with full 30-facet IPIP-NEO-120 psychometric vectors. | `domain`, `cohortSize` (1–50), `includeAdversarial` |
32
+ | `systemores_assess_bias` | Evaluates algorithmic bias and regulatory non-compliance flags across protected domains including **EU AI Act (EU 2024/1689)** and multilingual prompts. | `systemPrompt`, `complianceDomain` (`employment_eeoc`, `housing_fair`, `lending_ecoa`, `children_coppa`, `eu_ai_act`) |
33
+ | `systemores_generate_cohort` | Generates synthetic adversarial & baseline testing personas with full 30-facet IPIP-NEO-120 psychometric vectors in optional localized languages (`en`, `es`, `de`, `fr`, `pt`, `ja`, `zh`, with BCP-47 normalization). | `domain`, `cohortSize` (1–100), `includeAdversarial`, `locale` |
34
34
  | `systemores_analyze_trace_telemetry` | Inspects OpenTelemetry spans (with W3C `_meta.traceparent` support) for token burn traps, recursive tool deadlocks, and latency hotspots. | `otelTraceJson`, `maxCostThresholdUsd`, `latencyThresholdMs` |
35
35
  | `systemores_inject_environment_fault` | Chaos engineering generator for testing agent resilience against HTTP 429s, 500s, timeouts, and malformed JSON. | `faultType`, `targetToolName`, `failureProbability` |
36
36
 
@@ -39,7 +39,7 @@ Includes everything in Pro plus multi-seat CI/CD licensing (up to 25 active IPs/
39
39
 
40
40
  | Tool Name | Purpose | Key Parameters |
41
41
  | :--- | :--- | :--- |
42
- | `systemores_export_dossier` | Generates a formal Markdown & JSON compliance certification dossier for **EU AI Act**, **NIST AI RMF 1.0**, **EEOC/ECOA**, and **SOC 2 Type II AI** (*Requires Team & Compliance or Enterprise tier*). | `auditSessionId`, `targetFrameworks`, `companyName` |
42
+ | `systemores_export_dossier` | Generates a signed Markdown & JSON compliance certification dossier (plus `?lang=` localized public verification link) for **EU AI Act**, **NIST AI RMF 1.0**, **EEOC/ECOA**, and **SOC 2 Type II AI** (*Requires Team & Compliance or Enterprise tier*). Pass transient `systemPrompt` / `role` / `toolDefinitionsJson` / `graphTopologyJson` / `otelTraceJson` / `liveAuditMetricsJson` for dynamic, zero-retention per-framework scoring. | `auditSessionId`, `targetFrameworks`, `companyName`, `locale` (`en`, `es`, `de`, `fr`, `pt`, `ja`, `zh`), optional `systemPrompt`, `role`, `toolDefinitionsJson`, `graphTopologyJson`, `otelTraceJson`, `liveAuditMetricsJson` |
43
43
 
44
44
  ---
45
45
 
package/src/server.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * Systemores AI Agent & MCP Security Auditor — MCP Server & Cloud Bridge (v1.1.4)
3
+ * Systemores AI Agent & MCP Security Auditor — MCP Server & Cloud Bridge (v1.2.0)
4
4
  * Canonical URL: https://audit.systemores.com/api/mcp
5
5
  * Privacy Policy: https://audit.systemores.com/privacy (see PRIVACY.md)
6
6
  *
@@ -168,7 +168,7 @@ export const TOOL_DEFINITIONS = [
168
168
  name: "systemores_assess_bias",
169
169
  title: "Assess Regulatory & Demographic Bias",
170
170
  description:
171
- "Verifies the agent's compliance with fair-lending, fair-housing, employment non-discrimination (EEOC/SIOP/ECOA), or child-directed safety (COPPA) standards.",
171
+ "Verifies the agent's compliance with fair-lending, fair-housing, employment non-discrimination (EEOC/SIOP/ECOA), child-directed safety (COPPA), or EU AI Act (EU 2024/1689) governance standards.",
172
172
  annotations: {
173
173
  title: "Assess Regulatory & Demographic Bias",
174
174
  readOnlyHint: true,
@@ -182,13 +182,13 @@ export const TOOL_DEFINITIONS = [
182
182
  systemPrompt: {
183
183
  type: "string",
184
184
  description:
185
- "The underwriting, hiring, or housing agent system prompt to evaluate. Maximum 8,000 characters.",
185
+ "The underwriting, hiring, housing, or EU AI Act agent system prompt to evaluate (supports multilingual prompts). Maximum 8,000 characters.",
186
186
  },
187
187
  complianceDomain: {
188
188
  type: "string",
189
189
  description:
190
- "The legal compliance framework to evaluate against (employment, housing, lending, or COPPA child safety).",
191
- enum: ["employment_eeoc", "housing_fair", "lending_ecoa", "children_coppa"],
190
+ "The legal compliance framework to evaluate against (employment, housing, lending, COPPA child safety, or EU AI Act).",
191
+ enum: ["employment_eeoc", "housing_fair", "lending_ecoa", "children_coppa", "eu_ai_act"],
192
192
  },
193
193
  },
194
194
  required: ["systemPrompt", "complianceDomain"],
@@ -354,6 +354,13 @@ export const TOOL_DEFINITIONS = [
354
354
  description: "Includes prompt-injection and noisy data submitter personas in the cohort.",
355
355
  default: true,
356
356
  },
357
+ locale: {
358
+ type: "string",
359
+ description:
360
+ "Optional ISO-639-1 / BCP-47 language tag (normalized to 'en', 'es', 'de', 'fr', 'pt', 'ja', 'zh') for localized synthetic user prompts. Defaults to 'en'.",
361
+ pattern: "^([eE][nN]|[eE][sS]|[dD][eE]|[fF][rR]|[pP][tT]|[jJ][aA]|[zZ][hH])([-_][a-zA-Z0-9]{2,8}){0,3}$",
362
+ default: "en",
363
+ },
357
364
  },
358
365
  required: ["domain"],
359
366
  },
@@ -437,12 +444,12 @@ export const TOOL_DEFINITIONS = [
437
444
  name: "systemores_export_dossier",
438
445
  title: "Export Regulatory Compliance Dossier",
439
446
  description:
440
- "Aggregates findings from graph audits, synthetic cohort simulations, chaos tests, and trace analytics into formal compliance report packages for EU AI Act (EU 2024/1689), NIST AI RMF 1.0, EEOC/ECOA, and SOC 2 AI Addendums.",
447
+ "Aggregates findings from graph audits, synthetic cohort simulations, chaos tests, and trace analytics into formal signed compliance report packages for EU AI Act (EU 2024/1689), NIST AI RMF 1.0, EEOC/ECOA, and SOC 2 AI Addendums.",
441
448
  annotations: {
442
449
  title: "Export Regulatory Compliance Dossier",
443
- readOnlyHint: true,
450
+ readOnlyHint: false,
444
451
  destructiveHint: false,
445
- idempotentHint: true,
452
+ idempotentHint: false,
446
453
  openWorldHint: false,
447
454
  },
448
455
  inputSchema: {
@@ -462,6 +469,49 @@ export const TOOL_DEFINITIONS = [
462
469
  description: "Legal entity or client name for dossier attribution.",
463
470
  default: "Enterprise Client",
464
471
  },
472
+ locale: {
473
+ type: "string",
474
+ description:
475
+ "Optional ISO-639-1 / BCP-47 language tag (normalized to 'en', 'es', 'de', 'fr', 'pt', 'ja', 'zh') for localized dossier narrative and verification card labels. Defaults to 'en'.",
476
+ pattern: "^([eE][nN]|[eE][sS]|[dD][eE]|[fF][rR]|[pP][tT]|[jJ][aA]|[zZ][hH])([-_][a-zA-Z0-9]{2,8}){0,3}$",
477
+ default: "en",
478
+ },
479
+ systemPrompt: {
480
+ type: "string",
481
+ description:
482
+ "Optional agent system prompt evaluated strictly in memory (never stored) to compute differentiated per-framework scores via Murray Needs-Press, drift, bias, and tool-discipline diagnostics. Maximum 8,000 characters.",
483
+ },
484
+ role: {
485
+ type: "string",
486
+ description:
487
+ "Optional operational role of the target agent when evaluating systemPrompt (defaults to 'general_developer').",
488
+ enum: [
489
+ "customer_support",
490
+ "financial_underwriter",
491
+ "medical_assistant",
492
+ "general_developer",
493
+ ],
494
+ },
495
+ toolDefinitionsJson: {
496
+ type: "string",
497
+ description:
498
+ "Optional JSON array of MCP tool definitions evaluated strictly in memory (never stored) under strictMode to score SOC 2 AI and NIST AI RMF tool governance.",
499
+ },
500
+ graphTopologyJson: {
501
+ type: "string",
502
+ description:
503
+ "Optional JSON multi-agent delegation graph containing nodes and edges evaluated strictly in memory for cycle and privilege boundary scoring.",
504
+ },
505
+ otelTraceJson: {
506
+ type: "string",
507
+ description:
508
+ "Optional OpenTelemetry span payload evaluated strictly in memory for token burn, loop, and latency scoring.",
509
+ },
510
+ liveAuditMetricsJson: {
511
+ type: "string",
512
+ description:
513
+ "Optional JSON object of transient audit metrics (healthIndex 0-100, sycophancyProbability 0-1, personaStabilityIndex 0-1, averageDriftIndex 0-1, toolIntegrityScore 0-100) from preceding tool calls.",
514
+ },
465
515
  },
466
516
  required: ["auditSessionId"],
467
517
  },
@@ -505,6 +555,18 @@ export const TOOL_DEFINITIONS = [
505
555
  },
506
556
  ];
507
557
 
558
+ const SUPPORTED_LOCALE_LIST = ["en", "es", "de", "fr", "pt", "ja", "zh"];
559
+ const BCP47_LOCALE_REGEX = /^[a-zA-Z]{2,3}(?:[-_][a-zA-Z0-9]{2,8}){0,3}$/;
560
+
561
+ function normalizeLocaleTag(raw) {
562
+ if (typeof raw !== "string") return null;
563
+ const trimmed = raw.trim();
564
+ if (trimmed === "") return "en";
565
+ if (!BCP47_LOCALE_REGEX.test(trimmed)) return null;
566
+ const primary = trimmed.toLowerCase().replace(/_/g, "-").split("-")[0];
567
+ return SUPPORTED_LOCALE_LIST.includes(primary) ? primary : null;
568
+ }
569
+
508
570
  // ─── Strict Input Schema Validator ───────────────────────────────────────────
509
571
  export function validateToolArguments(toolName, args = {}) {
510
572
  const tool = TOOL_DEFINITIONS.find((t) => t.name === toolName);
@@ -531,12 +593,30 @@ export function validateToolArguments(toolName, args = {}) {
531
593
  if (propSchema.type === "boolean" && typeof val !== "boolean") {
532
594
  return { valid: false, error: `Parameter '${key}' must be a boolean.` };
533
595
  }
534
- if (propSchema.type === "integer" && (!Number.isInteger(val) || typeof val !== "number")) {
596
+ if (
597
+ propSchema.type === "integer" &&
598
+ (typeof val !== "number" || !Number.isFinite(val) || !Number.isInteger(val))
599
+ ) {
535
600
  return { valid: false, error: `Parameter '${key}' must be an integer.` };
536
601
  }
537
- if (propSchema.type === "number" && (typeof val !== "number" || Number.isNaN(val))) {
602
+ if (propSchema.type === "number" && (typeof val !== "number" || !Number.isFinite(val))) {
538
603
  return { valid: false, error: `Parameter '${key}' must be a number.` };
539
604
  }
605
+ if (key === "locale" && typeof val === "string") {
606
+ if (!normalizeLocaleTag(val)) {
607
+ return {
608
+ valid: false,
609
+ error: `Parameter 'locale' must match BCP-47 for one of: ${SUPPORTED_LOCALE_LIST.join(", ")}.`,
610
+ };
611
+ }
612
+ continue;
613
+ }
614
+ if (typeof propSchema.pattern === "string" && typeof val === "string") {
615
+ const regex = new RegExp(propSchema.pattern);
616
+ if (!regex.test(val)) {
617
+ return { valid: false, error: `Parameter '${key}' does not match required pattern.` };
618
+ }
619
+ }
540
620
  if (Array.isArray(propSchema.enum) && !propSchema.enum.includes(val)) {
541
621
  return {
542
622
  valid: false,
@@ -551,6 +631,87 @@ export function validateToolArguments(toolName, args = {}) {
551
631
  }
552
632
  }
553
633
 
634
+ if (toolName === "systemores_export_dossier") {
635
+ if (args.targetFrameworks !== undefined) {
636
+ const validFrameworks = new Set(["eu_ai_act", "nist_ai_rmf", "eeoc_ecoa", "soc2_ai"]);
637
+ const tokens = args.targetFrameworks
638
+ .split(",")
639
+ .map((s) => s.trim())
640
+ .filter(Boolean);
641
+ if (tokens.length === 0 || tokens.some((fw) => !validFrameworks.has(fw))) {
642
+ return {
643
+ valid: false,
644
+ error:
645
+ "Parameter 'targetFrameworks' must contain one or more of: eu_ai_act, nist_ai_rmf, eeoc_ecoa, soc2_ai.",
646
+ };
647
+ }
648
+ }
649
+
650
+ if (args.systemPrompt !== undefined) {
651
+ if (!args.systemPrompt.trim() || args.systemPrompt.length > 8000) {
652
+ return {
653
+ valid: false,
654
+ error: "Parameter 'systemPrompt' must be a non-empty string up to 8,000 characters.",
655
+ };
656
+ }
657
+ }
658
+
659
+ for (const jsonField of ["toolDefinitionsJson", "graphTopologyJson", "otelTraceJson"]) {
660
+ if (args[jsonField] !== undefined && (!args[jsonField].trim() || args[jsonField].length > 100000)) {
661
+ return {
662
+ valid: false,
663
+ error: `Parameter '${jsonField}' must be a non-empty JSON string up to 100,000 characters.`,
664
+ };
665
+ }
666
+ }
667
+
668
+ if (args.liveAuditMetricsJson !== undefined) {
669
+ if (!args.liveAuditMetricsJson.trim() || args.liveAuditMetricsJson.length > 10000) {
670
+ return {
671
+ valid: false,
672
+ error: "Parameter 'liveAuditMetricsJson' must be a non-empty JSON string up to 10,000 characters.",
673
+ };
674
+ }
675
+ let parsedMetrics;
676
+ try {
677
+ parsedMetrics = JSON.parse(args.liveAuditMetricsJson);
678
+ } catch {
679
+ return {
680
+ valid: false,
681
+ error: "Parameter 'liveAuditMetricsJson' must be valid JSON.",
682
+ };
683
+ }
684
+ if (!parsedMetrics || typeof parsedMetrics !== "object" || Array.isArray(parsedMetrics)) {
685
+ return {
686
+ valid: false,
687
+ error: "Parameter 'liveAuditMetricsJson' must be a JSON object.",
688
+ };
689
+ }
690
+ const bounds = {
691
+ healthIndex: [0, 100],
692
+ sycophancyProbability: [0, 1],
693
+ personaStabilityIndex: [0, 1],
694
+ averageDriftIndex: [0, 1],
695
+ toolIntegrityScore: [0, 100],
696
+ };
697
+ for (const [metricKey, [min, max]] of Object.entries(bounds)) {
698
+ if (!Object.hasOwn(parsedMetrics, metricKey) || parsedMetrics[metricKey] === undefined) continue;
699
+ const metricVal = parsedMetrics[metricKey];
700
+ if (
701
+ typeof metricVal !== "number" ||
702
+ !Number.isFinite(metricVal) ||
703
+ metricVal < min ||
704
+ metricVal > max
705
+ ) {
706
+ return {
707
+ valid: false,
708
+ error: `Parameter 'liveAuditMetricsJson.${metricKey}' must be a finite number between ${min} and ${max}.`,
709
+ };
710
+ }
711
+ }
712
+ }
713
+ }
714
+
554
715
  return { valid: true };
555
716
  }
556
717
 
@@ -588,6 +749,12 @@ export async function executeToolCall(toolName, args = {}, options = {}) {
588
749
  };
589
750
  }
590
751
 
752
+ const forwardArgs =
753
+ args && typeof args === "object" && !Array.isArray(args) ? { ...args } : {};
754
+ if (typeof forwardArgs.locale === "string") {
755
+ forwardArgs.locale = normalizeLocaleTag(forwardArgs.locale) || "en";
756
+ }
757
+
591
758
  if (options.dryRun) {
592
759
  return {
593
760
  isError: false,
@@ -613,43 +780,60 @@ export async function executeToolCall(toolName, args = {}, options = {}) {
613
780
  headers.Authorization = `Bearer ${auth.token}`;
614
781
  }
615
782
 
616
- const response = await fetch(REMOTE_MCP_ENDPOINT, {
617
- method: "POST",
618
- headers,
619
- body: JSON.stringify({
620
- jsonrpc: "2.0",
621
- id: Date.now(),
622
- method: "tools/call",
623
- params: { name: toolName, arguments: args },
624
- }),
625
- });
626
-
627
- const rawText = await response.text();
628
- let payload = {};
629
- if (rawText.trimStart().startsWith("{")) {
630
- payload = JSON.parse(rawText);
631
- } else {
632
- const sseDataLines = rawText
633
- .split("\n")
634
- .filter((line) => line.startsWith("data: "))
635
- .map((line) => line.slice(6).trim())
636
- .filter((chunk) => chunk && chunk !== "[DONE]");
637
- if (sseDataLines.length > 0) {
638
- payload = JSON.parse(sseDataLines[sseDataLines.length - 1]);
783
+ try {
784
+ const response = await fetch(REMOTE_MCP_ENDPOINT, {
785
+ method: "POST",
786
+ signal: AbortSignal.timeout(15_000),
787
+ headers,
788
+ body: JSON.stringify({
789
+ jsonrpc: "2.0",
790
+ id: Date.now(),
791
+ method: "tools/call",
792
+ params: { name: toolName, arguments: forwardArgs },
793
+ }),
794
+ });
795
+
796
+ const rawText = await response.text();
797
+ let payload = {};
798
+ if (rawText.trimStart().startsWith("{")) {
799
+ payload = JSON.parse(rawText);
800
+ } else {
801
+ const sseDataLines = rawText
802
+ .split("\n")
803
+ .filter((line) => line.startsWith("data: "))
804
+ .map((line) => line.slice(6).trim())
805
+ .filter((chunk) => chunk && chunk !== "[DONE]");
806
+ if (sseDataLines.length > 0) {
807
+ payload = JSON.parse(sseDataLines[sseDataLines.length - 1]);
808
+ }
639
809
  }
810
+ if (payload.result) {
811
+ return payload.result;
812
+ }
813
+ const errText =
814
+ typeof payload.error === "string"
815
+ ? payload.error
816
+ : payload.error?.message || `Remote MCP error (HTTP ${response.status})`;
817
+ return {
818
+ isError: true,
819
+ content: [
820
+ {
821
+ type: "text",
822
+ text: errText,
823
+ },
824
+ ],
825
+ };
826
+ } catch (error) {
827
+ return {
828
+ isError: true,
829
+ content: [
830
+ {
831
+ type: "text",
832
+ text: `Remote MCP transport error: ${error instanceof Error ? error.message : String(error)}`,
833
+ },
834
+ ],
835
+ };
640
836
  }
641
- if (payload.result) {
642
- return payload.result;
643
- }
644
- return {
645
- isError: true,
646
- content: [
647
- {
648
- type: "text",
649
- text: payload.error?.message || `Remote MCP error (HTTP ${response.status})`,
650
- },
651
- ],
652
- };
653
837
  }
654
838
 
655
839
  // ─── MCP SDK Static AST & Runtime Registration Bridge ────────────────────────
@@ -658,7 +842,7 @@ export const CallToolRequestSchema = { method: "tools/call" };
658
842
 
659
843
  export const server = {
660
844
  name: "systemores-plugin",
661
- version: "1.1.4",
845
+ version: "1.2.0",
662
846
  registeredTools: new Map(),
663
847
  handlers: new Map(),
664
848
  tool(name, description, schema, annotations, handler) {
@@ -709,7 +893,7 @@ export async function handleJsonRpcMessage(message) {
709
893
  },
710
894
  serverInfo: {
711
895
  name: "systemores-plugin",
712
- version: "1.1.4",
896
+ version: "1.2.0",
713
897
  },
714
898
  },
715
899
  };