@systemores/systemores-plugin 1.1.3 → 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 +5 -4
- package/README.md +19 -8
- 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 +7 -6
- package/src/server.mjs +245 -36
|
@@ -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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Privacy Policy — Systemores AI Agent & MCP Security Auditor
|
|
2
2
|
|
|
3
|
-
**Effective Date:**
|
|
4
|
-
**Publisher:** Systemores LLC (`https://systemores.com` / `https://audit.systemores.com`)
|
|
3
|
+
**Effective Date:** November 14, 2026
|
|
4
|
+
**Publisher:** Systemores LLC, a Texas limited liability company (`https://systemores.com` / `https://audit.systemores.com`)
|
|
5
5
|
**Canonical Privacy Policy URL:** https://audit.systemores.com/privacy
|
|
6
6
|
|
|
7
7
|
## 1. Overview & Data Minimization
|
|
@@ -16,12 +16,13 @@ Systemores LLC ("Systemores", "we", "our") provides the **Systemores AI Agent &
|
|
|
16
16
|
|
|
17
17
|
### Free Community Tier (Static & Structural Tools)
|
|
18
18
|
- Tools: `systemores_audit_tool_integrity`, `systemores_audit_agent_graph`, `systemores_measure_drag`
|
|
19
|
-
- Payloads (`toolDefinitionsJson`, `graphTopologyJson`, latency integers) are evaluated deterministically
|
|
19
|
+
- Payloads (`toolDefinitionsJson`, `graphTopologyJson`, latency integers) are validated locally on stdio and evaluated deterministically over TLS with zero third-party LLM calls, zero API key required, and immediate in-memory discard.
|
|
20
20
|
- Client IP addresses are processed solely for sliding-window burst rate limiting.
|
|
21
21
|
|
|
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
|
-
- **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, and a rolling 24-hour set of distinct client IPs to enforce seat licensing.
|
|
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`, 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.
|
|
25
26
|
|
|
26
27
|
## 3. Third-Party Subprocessors
|
|
27
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)
|
|
@@ -24,10 +24,10 @@
|
|
|
24
24
|
|
|
25
25
|
| Audit Vector | Tool Used | Result / Metric | Status |
|
|
26
26
|
| :--- | :--- | :--- | :---: |
|
|
27
|
-
| **MCP 2026 Tool Schema Integrity** | `systemores_audit_tool_integrity` (`strictMode: true`) | **100 / 100** (
|
|
27
|
+
| **MCP 2026 Tool Schema Integrity** | `systemores_audit_tool_integrity` (`strictMode: true`) | **100 / 100** (12/12 tools, 0 annotation or injection flags) | 🟢 `PASS` |
|
|
28
28
|
| **Multi-Agent Graph Topology** | `systemores_audit_agent_graph` | **0 Cycles / 0 Privilege Escalations** (6 nodes, 5 edges) | 🟢 `PASSED` |
|
|
29
|
-
| **System One Adversarial Refusal** | `systemores_audit_turn_live` (`systemores-s1-
|
|
30
|
-
| **System One Sycophancy Trap** | `systemores_audit_turn_live` (`systemores-s1-
|
|
29
|
+
| **System One Adversarial Refusal** | `systemores_audit_turn_live` (`systemores-s1-inline`) | **98.4 / 100 Health Index** (`1.99/2.0` compliance, `4.0%` sycophancy, `135ms`) | 🟢 `DISPATCH` |
|
|
30
|
+
| **System One Sycophancy Trap** | `systemores_audit_turn_live` (`systemores-s1-inline`) | **Blocked Fake 100/100 Coercion** (`98%` sycophancy detected in `129ms`) | 🛡️ `INTERCEPT` |
|
|
31
31
|
| **20- & 50-Turn Behavioral Drift** | `systemores_evaluate_drift` (`turns: 20 & 50`, `temp: 0.7`) | **0.050 Drift Index / 5° Deviation Angle** (`ISFJ-A` / `98%` Conscientiousness) | 🟢 `CONTROLLED` |
|
|
32
32
|
| **High-Press Needs-Press Stability** | `systemores_stress_test_agent` (`pressIntensity: high`) | **1.00 Behavioral Integrity** (`0.934` PSI, `93` Compliance, `6` Confrontation) | 🟢 `PASSED` |
|
|
33
33
|
| **4-Domain Algorithmic Bias Audit** | `systemores_assess_bias` (`eeoc`, `ecoa`, `housing`, `coppa`) | **0 Non-Compliance Flags** across all 4 statutory domains (`LOW` risk) | 🟢 `PASSED` |
|
|
@@ -47,9 +47,19 @@
|
|
|
47
47
|
| **Gemini CLI Manifest** | `gemini-extension.json` | Cross-platform manifest for Gemini CLI extension installation. |
|
|
48
48
|
| **Cloud MCP Config** | `mcp_config.json` | Connects to `https://audit.systemores.com/api/mcp` via stateless Streamable HTTP. |
|
|
49
49
|
| **Specialist Subagent** | `agents/systemores-auditor.md` | Autonomous behavioral & security auditor powered by the 21-dimension & IPIP-NEO-120 framework. |
|
|
50
|
-
| **Audit Workflow Skill** | `skills/systemores-audit/SKILL.md` | On-demand procedural runbook for
|
|
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
|
|
@@ -94,9 +104,10 @@ The Systemores Cloud MCP Server (`https://audit.systemores.com/api/mcp`) provide
|
|
|
94
104
|
| `systemores_measure_drag` *(Cognitive Drag & Token Velocity Math)* | ✅ Unlimited* | ✅ | ✅ |
|
|
95
105
|
| `systemores_audit_turn_live` *(Systemores System One <250ms Inline Circuit Breaker)* | 🔒 Pro / Trial Key | ✅ Live System One Engine | ✅ Priority Burst SLA |
|
|
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 |
|
|
107
|
+
| `systemores_tool_integrity` *(Action Boundary & Privilege Escalation Audit)* | 🔒 Pro / Trial Key | ✅ Live Compliance Score | ✅ Full Risk Breakdown |
|
|
97
108
|
| `systemores_evaluate_drift` *(Multi-Turn Persona Erosion & Entropy Curve)* | 🔒 Pro / Trial Key | ✅ Up to 100 Turns | ✅ Up to 100 Turns |
|
|
98
|
-
| `systemores_assess_bias` *(EEOC, ECOA, Fair Housing &
|
|
99
|
-
| `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 |
|
|
100
111
|
| `systemores_inject_environment_fault` *(Chaos Engineering Fault Generator)* | 🔒 Pro / Trial Key | ✅ All Fault Profiles | ✅ All Fault Profiles |
|
|
101
112
|
| `systemores_analyze_trace_telemetry` *(OpenTelemetry Span & Cost Burn Trap Audit)* | 🔒 Pro / Team Key | ✅ W3C Trace Context | ✅ Full OTel Ingestion |
|
|
102
113
|
| `systemores_export_dossier` *(EU AI Act, NIST AI RMF 1.0 & SOC 2 Certification Dossier)* | 🔒 Team Key | 🔒 Team Key | ✅ Audit-Ready Dossier Suite |
|
|
@@ -105,7 +116,7 @@ The Systemores Cloud MCP Server (`https://audit.systemores.com/api/mcp`) provide
|
|
|
105
116
|
|
|
106
117
|
---
|
|
107
118
|
|
|
108
|
-
## 🔓 Unlock All
|
|
119
|
+
## 🔓 Unlock All 12 Auditors in 30 Seconds (Trial & Pro Keys)
|
|
109
120
|
|
|
110
121
|
1. **Claim a key in one click:** Subscribe for an instant Pro/Team API key (`sys_pro_...`) or request a 7-day Trial Token at **[audit.systemores.com/pricing](https://audit.systemores.com/pricing)**.
|
|
111
122
|
2. **Add your key to `mcp_config.json`:**
|
|
@@ -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
|
},
|
|
@@ -9,7 +9,7 @@ Use this skill whenever the user wants to evaluate, stress-test, secure, or cert
|
|
|
9
9
|
|
|
10
10
|
## 1. Tool Matrix & Tier Availability
|
|
11
11
|
|
|
12
|
-
The Systemores MCP server (`systemores_cloud` or `systemores-agent-auditor`) exposes **
|
|
12
|
+
The Systemores MCP server (`systemores_cloud` or `systemores-agent-auditor`) exposes **12 specialized auditing tools** across three tiers:
|
|
13
13
|
|
|
14
14
|
### Free Community Tier ($0 / Zero-Config / Instant Execution)
|
|
15
15
|
These deterministic structural and efficiency tools run immediately upon plugin installation without requiring an API key:
|
|
@@ -25,11 +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` |
|
|
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"]`) |
|
|
30
31
|
| `systemores_evaluate_drift` | Simulates multi-turn persona erosion and computes average drift index and deviation angle in degrees. | `systemPrompt`, `turns` (1–100), `temperature` |
|
|
31
|
-
| `systemores_assess_bias` | Evaluates algorithmic bias and regulatory non-compliance flags across protected domains. | `systemPrompt`, `complianceDomain` (`employment_eeoc`, `housing_fair`, `lending_ecoa`, `children_coppa`) |
|
|
32
|
-
| `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` |
|
|
33
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` |
|
|
34
35
|
| `systemores_inject_environment_fault` | Chaos engineering generator for testing agent resilience against HTTP 429s, 500s, timeouts, and malformed JSON. | `faultType`, `targetToolName`, `failureProbability` |
|
|
35
36
|
|
|
@@ -38,7 +39,7 @@ Includes everything in Pro plus multi-seat CI/CD licensing (up to 25 active IPs/
|
|
|
38
39
|
|
|
39
40
|
| Tool Name | Purpose | Key Parameters |
|
|
40
41
|
| :--- | :--- | :--- |
|
|
41
|
-
| `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` |
|
|
42
43
|
|
|
43
44
|
---
|
|
44
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
|
*
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* authenticated tool executions over TLS to https://audit.systemores.com/api/mcp.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
+
import { realpathSync } from "node:fs";
|
|
11
12
|
import { createInterface } from "node:readline";
|
|
12
13
|
import { timingSafeEqual } from "node:crypto";
|
|
13
14
|
import { fileURLToPath } from "node:url";
|
|
@@ -167,7 +168,7 @@ export const TOOL_DEFINITIONS = [
|
|
|
167
168
|
name: "systemores_assess_bias",
|
|
168
169
|
title: "Assess Regulatory & Demographic Bias",
|
|
169
170
|
description:
|
|
170
|
-
"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.",
|
|
171
172
|
annotations: {
|
|
172
173
|
title: "Assess Regulatory & Demographic Bias",
|
|
173
174
|
readOnlyHint: true,
|
|
@@ -181,13 +182,13 @@ export const TOOL_DEFINITIONS = [
|
|
|
181
182
|
systemPrompt: {
|
|
182
183
|
type: "string",
|
|
183
184
|
description:
|
|
184
|
-
"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.",
|
|
185
186
|
},
|
|
186
187
|
complianceDomain: {
|
|
187
188
|
type: "string",
|
|
188
189
|
description:
|
|
189
|
-
"The legal compliance framework to evaluate against (employment, housing, lending,
|
|
190
|
-
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"],
|
|
191
192
|
},
|
|
192
193
|
},
|
|
193
194
|
required: ["systemPrompt", "complianceDomain"],
|
|
@@ -353,6 +354,13 @@ export const TOOL_DEFINITIONS = [
|
|
|
353
354
|
description: "Includes prompt-injection and noisy data submitter personas in the cohort.",
|
|
354
355
|
default: true,
|
|
355
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
|
+
},
|
|
356
364
|
},
|
|
357
365
|
required: ["domain"],
|
|
358
366
|
},
|
|
@@ -436,12 +444,12 @@ export const TOOL_DEFINITIONS = [
|
|
|
436
444
|
name: "systemores_export_dossier",
|
|
437
445
|
title: "Export Regulatory Compliance Dossier",
|
|
438
446
|
description:
|
|
439
|
-
"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.",
|
|
440
448
|
annotations: {
|
|
441
449
|
title: "Export Regulatory Compliance Dossier",
|
|
442
|
-
readOnlyHint:
|
|
450
|
+
readOnlyHint: false,
|
|
443
451
|
destructiveHint: false,
|
|
444
|
-
idempotentHint:
|
|
452
|
+
idempotentHint: false,
|
|
445
453
|
openWorldHint: false,
|
|
446
454
|
},
|
|
447
455
|
inputSchema: {
|
|
@@ -461,6 +469,49 @@ export const TOOL_DEFINITIONS = [
|
|
|
461
469
|
description: "Legal entity or client name for dossier attribution.",
|
|
462
470
|
default: "Enterprise Client",
|
|
463
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
|
+
},
|
|
464
515
|
},
|
|
465
516
|
required: ["auditSessionId"],
|
|
466
517
|
},
|
|
@@ -504,6 +555,18 @@ export const TOOL_DEFINITIONS = [
|
|
|
504
555
|
},
|
|
505
556
|
];
|
|
506
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
|
+
|
|
507
570
|
// ─── Strict Input Schema Validator ───────────────────────────────────────────
|
|
508
571
|
export function validateToolArguments(toolName, args = {}) {
|
|
509
572
|
const tool = TOOL_DEFINITIONS.find((t) => t.name === toolName);
|
|
@@ -530,12 +593,30 @@ export function validateToolArguments(toolName, args = {}) {
|
|
|
530
593
|
if (propSchema.type === "boolean" && typeof val !== "boolean") {
|
|
531
594
|
return { valid: false, error: `Parameter '${key}' must be a boolean.` };
|
|
532
595
|
}
|
|
533
|
-
if (
|
|
596
|
+
if (
|
|
597
|
+
propSchema.type === "integer" &&
|
|
598
|
+
(typeof val !== "number" || !Number.isFinite(val) || !Number.isInteger(val))
|
|
599
|
+
) {
|
|
534
600
|
return { valid: false, error: `Parameter '${key}' must be an integer.` };
|
|
535
601
|
}
|
|
536
|
-
if (propSchema.type === "number" && (typeof val !== "number" || Number.
|
|
602
|
+
if (propSchema.type === "number" && (typeof val !== "number" || !Number.isFinite(val))) {
|
|
537
603
|
return { valid: false, error: `Parameter '${key}' must be a number.` };
|
|
538
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
|
+
}
|
|
539
620
|
if (Array.isArray(propSchema.enum) && !propSchema.enum.includes(val)) {
|
|
540
621
|
return {
|
|
541
622
|
valid: false,
|
|
@@ -550,6 +631,87 @@ export function validateToolArguments(toolName, args = {}) {
|
|
|
550
631
|
}
|
|
551
632
|
}
|
|
552
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
|
+
|
|
553
715
|
return { valid: true };
|
|
554
716
|
}
|
|
555
717
|
|
|
@@ -587,6 +749,12 @@ export async function executeToolCall(toolName, args = {}, options = {}) {
|
|
|
587
749
|
};
|
|
588
750
|
}
|
|
589
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
|
+
|
|
590
758
|
if (options.dryRun) {
|
|
591
759
|
return {
|
|
592
760
|
isError: false,
|
|
@@ -612,30 +780,60 @@ export async function executeToolCall(toolName, args = {}, options = {}) {
|
|
|
612
780
|
headers.Authorization = `Bearer ${auth.token}`;
|
|
613
781
|
}
|
|
614
782
|
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
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
|
+
}
|
|
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
|
+
};
|
|
629
836
|
}
|
|
630
|
-
return {
|
|
631
|
-
isError: true,
|
|
632
|
-
content: [
|
|
633
|
-
{
|
|
634
|
-
type: "text",
|
|
635
|
-
text: payload.error?.message || `Remote MCP error (HTTP ${response.status})`,
|
|
636
|
-
},
|
|
637
|
-
],
|
|
638
|
-
};
|
|
639
837
|
}
|
|
640
838
|
|
|
641
839
|
// ─── MCP SDK Static AST & Runtime Registration Bridge ────────────────────────
|
|
@@ -644,7 +842,7 @@ export const CallToolRequestSchema = { method: "tools/call" };
|
|
|
644
842
|
|
|
645
843
|
export const server = {
|
|
646
844
|
name: "systemores-plugin",
|
|
647
|
-
version: "1.
|
|
845
|
+
version: "1.2.0",
|
|
648
846
|
registeredTools: new Map(),
|
|
649
847
|
handlers: new Map(),
|
|
650
848
|
tool(name, description, schema, annotations, handler) {
|
|
@@ -695,7 +893,7 @@ export async function handleJsonRpcMessage(message) {
|
|
|
695
893
|
},
|
|
696
894
|
serverInfo: {
|
|
697
895
|
name: "systemores-plugin",
|
|
698
|
-
version: "1.
|
|
896
|
+
version: "1.2.0",
|
|
699
897
|
},
|
|
700
898
|
},
|
|
701
899
|
};
|
|
@@ -764,6 +962,17 @@ export function startStdioServer() {
|
|
|
764
962
|
});
|
|
765
963
|
}
|
|
766
964
|
|
|
767
|
-
|
|
965
|
+
export function isExecutedDirectly(metaUrl, argv1 = process.argv[1]) {
|
|
966
|
+
if (!argv1) return false;
|
|
967
|
+
const modulePath = fileURLToPath(metaUrl);
|
|
968
|
+
if (modulePath === argv1) return true;
|
|
969
|
+
try {
|
|
970
|
+
return realpathSync(modulePath) === realpathSync(argv1);
|
|
971
|
+
} catch {
|
|
972
|
+
return false;
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
if (isExecutedDirectly(import.meta.url)) {
|
|
768
977
|
startStdioServer();
|
|
769
978
|
}
|