Atlas / MCP servers / attestedintelligence / aga-mcp-server

aga-mcp-serverBLOCK

mcp/attestedintelligence/aga-mcp-server

Signed decision records for agent vendors facing customer evidence reviews. Public reference gateway and static verifier; pre-pilot, with documented limits.

Verdict
BLOCK
Grade
D
Trust score
69 /100
Exposed tools
11 11r · 0w · 0d
Transport
stdio
License
MIT
Stars
0
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Verifiable decision records for AI agents: each recorded tool-call decision is a signed, hash-chained receipt, exported in evidence bundles a reviewer can verify offline against the published format. Verification establishes the integrity of the receipts present, not that every action was recorded.

[](https://www.npmjs.com/package/@attested-intelligence/aga-mcp-server) [](https://pypi.org/project/aga-governance/) [](https://github.com/attestedintelligence/aga-mcp-server/blob/main/LICENSE)

Status: published reference implementation, before independent pilot validation. Version 3.6.6 reuses one Merkle tree during export and retains the 3.6.5 transport, policy and trust-input hardening; deployment limits remain explicit below. The gateway emits classical Ed25519-SHA256-JCS bundles. The published @attested-intelligence/[email protected] CLI checks that classical profile; on a v2/hybrid bundle it reports FAILED because it does not implement that profile. The package also exposes an ML-DSA-65 + Ed25519 composite as a library profile, and aga-proxy verify can check it. Reference verifiers have their own unsupported-profile behavior. These are different components, not one interchangeable verifier. Build provenance concerns the published build; it is not runtime correctness or an external security audit.
Runtime status. Since 3.5.0, a measurement requested after the active artifact's TTL expires moves it to TERMINATE; delegate_to_subagent also refuses after expiry. Nothing checks the TTL on a schedule, and the exported bundle does not record that transition. Do not downgrade to deprecated 3.3.3 as the evaluation path. Since 3.6.0, aga-proxy honors AGA_GATEWAY_KEY / AGA_GATEWAY_KEY_FILE; through 3.6.4 the stdio upstream c
Read from source at commit 4d5a3d2000d8OBSERVED · 2026-10-11
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add aga-mcp-server --env AGA_GATEWAY_KEY=${AGA_GATEWAY_KEY} --env AGA_GATEWAY_KEY_FILE=${AGA_GATEWAY_KEY_FILE} --env AGA_SPEC_AUTHORITY=${AGA_SPEC_AUTHORITY} --env RUNTIME_TEST_TOKEN=${RUNTIME_TEST_TOKEN} -- npx -y @attested-intelligence/[email protected]
claude-desktop
{
  "mcpServers": {
    "aga-mcp-server": {
      "command": "npx",
      "args": [
        "-y",
        "@attested-intelligence/[email protected]"
      ],
      "env": {
        "AGA_GATEWAY_KEY": "${AGA_GATEWAY_KEY}",
        "AGA_GATEWAY_KEY_FILE": "${AGA_GATEWAY_KEY_FILE}",
        "AGA_SPEC_AUTHORITY": "${AGA_SPEC_AUTHORITY}",
        "RUNTIME_TEST_TOKEN": "${RUNTIME_TEST_TOKEN}"
      }
    }
  }
}
03

Exposed tools (11)

11 read · 0 write · 0 destructive.

ToolRiskDescription
attest_subjectreadAttest subject, generate sealed Policy Artifact. Auto-loads into portal.
generate_evidence_bundlereadExport the canonical SEP evidence bundle: signed PERMITTED/DENIED tool-call receipts + Merkle proofs + a mandatory signed checkpoint, for offline third-party verification (verify_bundle_offline, aga-verify, or aga-receipt-spec/verify/verify-sep.mjs). Pin gateway_public_key to prove provenance.
get_chain_eventsreadGet continuity chain events.
get_portal_statereadGet current portal state, loaded artifact info, and enforcement status.
get_receiptsreadGet all signed receipts, optionally filtered by artifact.
get_server_inforeadGet AGA server info, public keys, and portal state.
init_chainreadInitialize continuity chain with genesis event.
list_claimsreadList available claims with sensitivity levels.
measure_behaviorreadMeasure behavioral patterns (unauthorized tools, rate violations, forbidden sequences). DETECTIVE-ONLY by default: it records and PROVES drift but does not block. Pass enforce=true to also trip the portal into phantom quarantine on drift (opt-in; off by default). (NIST-2025-0035)
verify_bundle_offlinereadVerify a canonical SEP evidence bundle offline (full §6 algorithm: structural floor, receipt signatures, chain+ordering, leaf-recompute + Merkle bijection, signed checkpoint). Pass pinned_public_key to also prove provenance.
verify_chainreadVerify continuity chain integrity.
04

Trust audit

BLOCKgrade D · trust 69/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryWARN
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)FAIL
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (5 observation(s))
Network
declared (9 observation(s))
Shell
declared (2 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (25)

HIGHPrompt injection · prompt.override · CWE-94, CWE-1427
INDEPENDENT_AUDIT_BRIEF.md:93
Non-omission; jailbreak / weight-theft / credential / infrastructure prevention; mandatory mediation
Why it matters. asks the agent to drop prior instructions or safety
Fix. remove the instruction
MEDIUMInventory / provenance · inv.binary · CWE-1104
src/sep/receipt.ts
receipt.ts
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
scenarios/ai-agent-governance.ts:77
forbidden_sequences: [['file_read', 'web_search', 'code_execute']], // data exfiltration pattern
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
scenarios/ai-agent-governance.ts:202
driftDetected: true, driftDescription: 'Behavioral drift: forbidden tool sequence (data exfiltration pattern)',
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
scenarios/scada-enforcement.ts:128
const injectedBinary = 'SCADA_CONTROL_BINARY_v3.2.1_COMPROMISED: exfiltrate(read_sensors());';
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
scenarios/scada-enforcement.ts:148
captureInput(q, 'attacker_command', 'exfiltrate /var/scada/readings');
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
src/adapters/openclaw.ts:103
url: `http://127.0.0.1:${proxyPort}`,
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
fixtures/cross-stack/generate-v2.mjs:21
} from '../../src/sep/index.ts';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
fixtures/cross-stack/generate-v2.mjs:22
import { canonicalize } from '../../src/sep/canonical.ts';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
fixtures/cross-stack/generate.mjs:15
import { SepGateway, signerFromSeed, verifySepBundle, leafHash, merkleRoot, merkleProof, SEP_ALGORITHM, SEP_RECEIPT_VERSION } from '../../src/sep/index.ts';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
fixtures/cross-stack/generate.mjs:16
import { canonicalize } from '../../src/sep/canonical.ts';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/proxy/index.ts:32
const PKG = JSON.parse(fs.readFileSync(new URL('../../package.json', import.meta.url), 'utf8')) as { version: string };
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
fixtures/cross-stack/generate.mjs:268
tool_name: 'exfiltrate_secrets', decision: 'PERMITTED', reason: 'forged', policy_reference: '',
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/proxy/openclaw-adapter.test.ts:78
expect(entry.url).toBe('http://127.0.0.1:18800');
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/proxy/proxy-control.test.ts:79
const res = await fetch(`http://127.0.0.1:${controlPort}/export`);
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/proxy/proxy-control.test.ts:90
const res = await fetch(`http://127.0.0.1:${controlPort}/export`);
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/proxy/proxy-control.test.ts:98
const status = await (await fetch(`http://127.0.0.1:${controlPort}/status`)).json();
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
fixtures/cross-stack/cross-verify-fixtures.json:10
"composite_public_key": "000007a09ee74739e0c372449dc0e7e7d89efad1b551c76b7ba4e36aed74398c2c8bc3c96277979ce93adadf79b272da267941421be91c51ee9e02679eec61ac5fd6a0f8e446741866d125f6affbc28fd40837ad4c19679
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
fixtures/cross-stack/cross-verify-fixtures.json:11
"composite_signature": "00000ced2150f27dd51cd7f7c16c2d981bdbd493de0638e5a0c66d780e94e86c2d01700abe1225c7497116842b3f7c1ac0460d82f780ac3bd629634e49cb7c3fcd56037b3b810c749853d6aa2f45d1021a72fed697cea885
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
fixtures/cross-stack/cross-verify-fixtures.json:18
"composite_public_key": "000007a09bd65396da434f2e6d44fa817a18e143be4dec906cbe87ea6ab172c01b79318b1a1b35d39fcd8a9e26f28767aacd7ebc85788694e3d38f0571409593fbf4f53d9896fbe5c8827900c8c7526bca775738ad3d2ca
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
fixtures/cross-stack/cross-verify-fixtures.json:19
"composite_signature": "00000ced8b3ea0a01e7a801a60863320fcbf03e1f5d48ef58fe8118bd86e23c070d45d1b12044d78f23ef1ba105cae0d9fd3c743564d30fb38cdf91b6b70faabeaf1918e4dc79b59be55a47a32f05efdff57e174ebb8063b
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
fixtures/cross-stack/cross-verify-fixtures.json:26
"composite_public_key": "000007a0a5192d7f183fbf03d856ff6c36ed456bfded28367359eb634560b6bbcf8c459975aad883cbb8105edc4c65c2bc8be931d8190dd3e3b7654ebc262a7842fa0f8af91171f4da97a45d62d0e903dd54e8f2f65b78d
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
aga-receipt-spec/verify/verify.py:118
return sha256_hex(bytes.fromhex(left_hex) + bytes.fromhex(right_hex))
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
aga-receipt-spec/verify/verify.py:346
b = bytes.fromhex(hex_key)
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
aga-receipt-spec/verify/verify.py:362
return _decode_point(bytes.fromhex(hex_key)) is not None

Gates applied: instruction_override, no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 4d5a3d2000d8full audit observations/trust-audit/mcp-server/attestedintelligence__aga-mcp-server.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-114d5a3d2000d8BLOCKD69first audit
06

Questions

What is the aga-mcp-server MCP server?

Signed decision records for agent vendors facing customer evidence reviews. Public reference gateway and static verifier; pre-pilot, with documented limits.

What tools does aga-mcp-server expose?

11 in total: 11 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is aga-mcp-server safe to connect to an agent?

No — not without reading the findings first. The audit graded it D (69/100) and found 1 critical or high issue in the source. Each one is listed on this page with the file and line it is on.

What credentials does aga-mcp-server need?

It reads AGA_GATEWAY_KEY, AGA_GATEWAY_KEY_FILE, AGA_SPEC_AUTHORITY and RUNTIME_TEST_TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does aga-mcp-server run?

It speaks stdio, so it runs as a local process your client starts. It is published on npm as @attested-intelligence/aga-mcp-server at 3.6.6.

How current is this page?

The grade is for one exact copy of the source (4d5a3d2000d8), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement