@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.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/PRIVACY.md +1 -1
- package/README.md +13 -3
- package/agents/systemores-auditor.md +6 -6
- package/gemini-extension.json +1 -1
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/server.json +2 -2
- package/skills/systemores-audit/SKILL.md +6 -6
- package/src/server.mjs +231 -47
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
[](https://audit.systemores.com)
|
|
6
6
|
[](https://www.npmjs.com/package/@systemores/systemores-plugin)
|
|
7
7
|
[](https://registry.modelcontextprotocol.io)
|
|
8
8
|
[](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 &
|
|
100
|
-
| `systemores_generate_cohort` *(30-Facet IPIP-NEO-120 Synthetic Adversarial Cohorts)* | 🔒 Pro / Trial Key | ✅ Up to
|
|
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
|
|
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 |
|
|
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
|
|
package/gemini-extension.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "systemores",
|
|
3
|
-
"version": "1.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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–
|
|
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
|
|
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.
|
|
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),
|
|
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
|
|
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,
|
|
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:
|
|
450
|
+
readOnlyHint: false,
|
|
444
451
|
destructiveHint: false,
|
|
445
|
-
idempotentHint:
|
|
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 (
|
|
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.
|
|
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
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
payload =
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
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.
|
|
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.
|
|
896
|
+
version: "1.2.0",
|
|
713
897
|
},
|
|
714
898
|
},
|
|
715
899
|
};
|