@shield-agent/kya 0.5.0 → 0.7.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/.mcp.json +1 -1
- package/LIMITATIONS.md +1 -0
- package/README.md +30 -3
- package/amp/settings.example.json +1 -1
- package/catalog/agent-trust-baseline-v0.json +103 -0
- package/claude/claude_desktop_config.example.json +1 -1
- package/cline/cline_mcp_settings.example.json +1 -1
- package/copilot/mcp-config.example.json +1 -1
- package/dist/certify/attest.d.ts +10 -0
- package/dist/certify/attest.d.ts.map +1 -0
- package/dist/certify/attest.js +105 -0
- package/dist/certify/attest.js.map +1 -0
- package/dist/certify/catalog.d.ts +70 -0
- package/dist/certify/catalog.d.ts.map +1 -0
- package/dist/certify/catalog.js +245 -0
- package/dist/certify/catalog.js.map +1 -0
- package/dist/certify/context.d.ts +11 -0
- package/dist/certify/context.d.ts.map +1 -0
- package/dist/certify/context.js +49 -0
- package/dist/certify/context.js.map +1 -0
- package/dist/certify/evaluate.d.ts +100 -0
- package/dist/certify/evaluate.d.ts.map +1 -0
- package/dist/certify/evaluate.js +220 -0
- package/dist/certify/evaluate.js.map +1 -0
- package/dist/certify/live.d.ts +3 -0
- package/dist/certify/live.d.ts.map +1 -0
- package/dist/certify/live.js +39 -0
- package/dist/certify/live.js.map +1 -0
- package/dist/certify/render.d.ts +6 -0
- package/dist/certify/render.d.ts.map +1 -0
- package/dist/certify/render.js +243 -0
- package/dist/certify/render.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +56 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/certify.d.ts +47 -0
- package/dist/commands/certify.d.ts.map +1 -0
- package/dist/commands/certify.js +170 -0
- package/dist/commands/certify.js.map +1 -0
- package/dist/commands/connect.d.ts +1 -8
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +3 -39
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/wire-hooks.d.ts.map +1 -1
- package/dist/commands/wire-hooks.js +2 -1
- package/dist/commands/wire-hooks.js.map +1 -1
- package/dist/config.d.ts +21 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +42 -9
- package/dist/config.js.map +1 -1
- package/dist/fs-atomic.d.ts +9 -0
- package/dist/fs-atomic.d.ts.map +1 -0
- package/dist/fs-atomic.js +44 -0
- package/dist/fs-atomic.js.map +1 -0
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/receipt/enrich.d.ts +27 -0
- package/dist/receipt/enrich.d.ts.map +1 -1
- package/dist/receipt/enrich.js +59 -0
- package/dist/receipt/enrich.js.map +1 -1
- package/dist/receipt/render-receipt.d.ts +3 -1
- package/dist/receipt/render-receipt.d.ts.map +1 -1
- package/dist/receipt/render-receipt.js +45 -1
- package/dist/receipt/render-receipt.js.map +1 -1
- package/dist/sign/evidence-bundle.d.ts +59 -0
- package/dist/sign/evidence-bundle.d.ts.map +1 -0
- package/dist/sign/evidence-bundle.js +193 -0
- package/dist/sign/evidence-bundle.js.map +1 -0
- package/droid/README.md +1 -1
- package/droid/mcp.example.json +1 -1
- package/gemini/settings.example.json +1 -1
- package/grok/README.md +1 -1
- package/kilo/kilo.example.json +1 -1
- package/kimi/mcp.example.json +1 -1
- package/kiro/mcp.example.json +1 -1
- package/manifest.json +1 -1
- package/mastracode/mcp.example.json +1 -1
- package/mcp.json +1 -1
- package/openai/codex.config.example.toml +1 -1
- package/opencode/opencode.example.json +1 -1
- package/package.json +2 -1
- package/qwen/settings.example.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Signed evidence bundles (v1) — the OSS half of hosted verification.
|
|
3
|
+
* Self-signed by a locally generated ed25519 key: proves bundle integrity and
|
|
4
|
+
* continuity of a key, NOT identity. Identity binding is a hosted claim.
|
|
5
|
+
* node:crypto only — the package dependency list is locked.
|
|
6
|
+
*/
|
|
7
|
+
import { createHash, createPrivateKey, createPublicKey, generateKeyPairSync, sign, verify, } from "node:crypto";
|
|
8
|
+
import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync, } from "node:fs";
|
|
9
|
+
import { dirname, join } from "node:path";
|
|
10
|
+
import { globalConfigDir } from "../config.js";
|
|
11
|
+
import { assertNoSecrets } from "../dash/render.js";
|
|
12
|
+
import { UsageError } from "../errors.js";
|
|
13
|
+
import { canonicalJson } from "../hash.js";
|
|
14
|
+
export const EVIDENCE_BUNDLE_FORMAT = "shield-kya-evidence-bundle";
|
|
15
|
+
export const EVIDENCE_BUNDLE_VERSION = 1;
|
|
16
|
+
export function evidenceKeyPath(env = process.env) {
|
|
17
|
+
return join(globalConfigDir(env), "keys", "evidence-ed25519.json");
|
|
18
|
+
}
|
|
19
|
+
export function fingerprintSpki(spkiDer) {
|
|
20
|
+
return createHash("sha256").update(spkiDer).digest("hex").slice(0, 16);
|
|
21
|
+
}
|
|
22
|
+
/** Rebuild an EvidenceKey from the on-disk JSON shape. Throws UsageError on corrupt input. */
|
|
23
|
+
export function evidenceKeyFromSerialized(raw) {
|
|
24
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
|
|
25
|
+
throw new UsageError("evidence key file is not an object");
|
|
26
|
+
}
|
|
27
|
+
const rec = raw;
|
|
28
|
+
if (rec.version !== 1) {
|
|
29
|
+
throw new UsageError("evidence key file has an unsupported version");
|
|
30
|
+
}
|
|
31
|
+
if (typeof rec.privateKeyPkcs8 !== "string" ||
|
|
32
|
+
typeof rec.publicKeySpki !== "string") {
|
|
33
|
+
throw new UsageError("evidence key file is missing key material");
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
const privateKey = createPrivateKey({
|
|
37
|
+
key: Buffer.from(rec.privateKeyPkcs8, "base64url"),
|
|
38
|
+
format: "der",
|
|
39
|
+
type: "pkcs8",
|
|
40
|
+
});
|
|
41
|
+
const publicKey = createPublicKey({
|
|
42
|
+
key: Buffer.from(rec.publicKeySpki, "base64url"),
|
|
43
|
+
format: "der",
|
|
44
|
+
type: "spki",
|
|
45
|
+
});
|
|
46
|
+
const spkiDer = Buffer.from(publicKey.export({ format: "der", type: "spki" }));
|
|
47
|
+
const derivedSpkiDer = Buffer.from(createPublicKey(privateKey).export({ format: "der", type: "spki" }));
|
|
48
|
+
if (!derivedSpkiDer.equals(spkiDer)) {
|
|
49
|
+
throw new Error("pub/private key mismatch");
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
publicKey,
|
|
53
|
+
privateKey,
|
|
54
|
+
pubkeyB64u: spkiDer.toString("base64url"),
|
|
55
|
+
fingerprint: fingerprintSpki(spkiDer),
|
|
56
|
+
created: false,
|
|
57
|
+
regenerated: false,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
throw new UsageError("evidence key file is corrupt — regenerating (old bundles stay verifiable only with the old pubkey)");
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/** Load the evidence signing key, generating one (mode 0600) on first use. */
|
|
65
|
+
export function loadOrCreateEvidenceKey(env = process.env) {
|
|
66
|
+
const path = evidenceKeyPath(env);
|
|
67
|
+
let existed = false;
|
|
68
|
+
if (existsSync(path)) {
|
|
69
|
+
existed = true;
|
|
70
|
+
try {
|
|
71
|
+
return evidenceKeyFromSerialized(JSON.parse(readFileSync(path, "utf8")));
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
/* corrupt or unreadable key file: regenerate below */
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const { publicKey, privateKey } = generateKeyPairSync("ed25519");
|
|
78
|
+
const spkiDer = Buffer.from(publicKey.export({ format: "der", type: "spki" }));
|
|
79
|
+
const pkcs8Der = Buffer.from(privateKey.export({ format: "der", type: "pkcs8" }));
|
|
80
|
+
const doc = {
|
|
81
|
+
version: 1,
|
|
82
|
+
createdAt: new Date().toISOString(),
|
|
83
|
+
publicKeySpki: spkiDer.toString("base64url"),
|
|
84
|
+
privateKeyPkcs8: pkcs8Der.toString("base64url"),
|
|
85
|
+
};
|
|
86
|
+
mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
|
|
87
|
+
writeFileSync(path, `${JSON.stringify(doc, null, 2)}\n`, {
|
|
88
|
+
encoding: "utf8",
|
|
89
|
+
mode: 0o600,
|
|
90
|
+
});
|
|
91
|
+
try {
|
|
92
|
+
chmodSync(path, 0o600);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
/* best-effort on non-POSIX */
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
publicKey,
|
|
99
|
+
privateKey,
|
|
100
|
+
pubkeyB64u: doc.publicKeySpki,
|
|
101
|
+
fingerprint: fingerprintSpki(spkiDer),
|
|
102
|
+
created: true,
|
|
103
|
+
regenerated: existed,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/** sig = base64url( ed25519_sign( canonicalJson(body) ) ) — canonicalJson from src/hash.ts. */
|
|
107
|
+
export function signCanonicalPayload(body, privateKey) {
|
|
108
|
+
const payload = Buffer.from(canonicalJson(body), "utf8");
|
|
109
|
+
return sign(null, payload, privateKey).toString("base64url");
|
|
110
|
+
}
|
|
111
|
+
/** Verify `sig` over canonicalJson(bundle without the `sig` and `pubkey` fields) using the embedded `pubkey`. */
|
|
112
|
+
export function verifyBundleSignature(bundle) {
|
|
113
|
+
const sig = bundle.sig;
|
|
114
|
+
const pubkey = bundle.pubkey;
|
|
115
|
+
if (typeof sig !== "string" || typeof pubkey !== "string")
|
|
116
|
+
return false;
|
|
117
|
+
const { sig: _omitSig, pubkey: _omitPubkey, ...body } = bundle;
|
|
118
|
+
void _omitSig;
|
|
119
|
+
void _omitPubkey;
|
|
120
|
+
try {
|
|
121
|
+
const key = createPublicKey({
|
|
122
|
+
key: Buffer.from(pubkey, "base64url"),
|
|
123
|
+
format: "der",
|
|
124
|
+
type: "spki",
|
|
125
|
+
});
|
|
126
|
+
return verify(null, Buffer.from(canonicalJson(body), "utf8"), key, Buffer.from(sig, "base64url"));
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const MAX_BUNDLE_EVIDENCE_CHARS = 200;
|
|
133
|
+
/**
|
|
134
|
+
* Clip to MAX code points (not UTF-16 units): a surrogate-splitting slice
|
|
135
|
+
* re-encodes differently in Java (`?`) than Node (U+FFFD) → cross-repo sig mismatch.
|
|
136
|
+
*/
|
|
137
|
+
function clipBundleEvidence(evidence) {
|
|
138
|
+
const chars = Array.from(evidence);
|
|
139
|
+
return chars.length > MAX_BUNDLE_EVIDENCE_CHARS
|
|
140
|
+
? `${chars.slice(0, MAX_BUNDLE_EVIDENCE_CHARS - 1).join("")}…`
|
|
141
|
+
: evidence;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Build a signed evidence bundle v1 (hard cross-repo contract — see
|
|
145
|
+
* docs/certify.md). sig = base64url(ed25519_sign(canonicalJson(body))) where
|
|
146
|
+
* body is the bundle without the sig and pubkey fields (same stripping as
|
|
147
|
+
* verifyBundleSignature). Self-signed: integrity + key continuity, NOT identity.
|
|
148
|
+
*/
|
|
149
|
+
export function buildEvidenceBundle(input, key) {
|
|
150
|
+
const report = input.report;
|
|
151
|
+
const agent = input.agent && Object.values(input.agent).some((v) => v !== undefined)
|
|
152
|
+
? Object.fromEntries(Object.entries(input.agent).filter(([, v]) => v !== undefined))
|
|
153
|
+
: undefined;
|
|
154
|
+
const body = {
|
|
155
|
+
format: EVIDENCE_BUNDLE_FORMAT,
|
|
156
|
+
version: EVIDENCE_BUNDLE_VERSION,
|
|
157
|
+
generatedAt: report.generatedAt,
|
|
158
|
+
...(agent ? { agent } : {}),
|
|
159
|
+
catalog: { id: report.catalog.id, version: report.catalog.version },
|
|
160
|
+
window: {
|
|
161
|
+
days: report.window.days,
|
|
162
|
+
since: report.window.since,
|
|
163
|
+
until: report.window.until,
|
|
164
|
+
},
|
|
165
|
+
trail: {
|
|
166
|
+
eventCount: report.trail.eventCount,
|
|
167
|
+
digest: createHash("sha256")
|
|
168
|
+
.update(canonicalJson(input.windowEvents), "utf8")
|
|
169
|
+
.digest("hex"),
|
|
170
|
+
verdictMix: report.trail.verdictMix,
|
|
171
|
+
modes: report.trail.modes,
|
|
172
|
+
},
|
|
173
|
+
requirements: report.requirements.map((r) => ({
|
|
174
|
+
id: r.id,
|
|
175
|
+
domain: r.domain,
|
|
176
|
+
status: r.status,
|
|
177
|
+
evidence: clipBundleEvidence(r.evidence),
|
|
178
|
+
...(r.attestation
|
|
179
|
+
? { attestation: { text: r.attestation.text, at: r.attestation.at } }
|
|
180
|
+
: {}),
|
|
181
|
+
})),
|
|
182
|
+
overall: report.overall,
|
|
183
|
+
};
|
|
184
|
+
// egress-artifact defense-in-depth, same scan as report.json
|
|
185
|
+
const payload = canonicalJson(body);
|
|
186
|
+
assertNoSecrets(payload);
|
|
187
|
+
return {
|
|
188
|
+
...body,
|
|
189
|
+
pubkey: key.pubkeyB64u,
|
|
190
|
+
sig: sign(null, Buffer.from(payload, "utf8"), key.privateKey).toString("base64url"),
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=evidence-bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-bundle.js","sourceRoot":"","sources":["../../src/sign/evidence-bundle.ts"],"names":[],"mappings":"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"}
|
package/droid/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Droid (Factory) + Shield KYA
|
|
2
2
|
|
|
3
|
-
Preferred path is Droid's own CLI: `droid mcp add shield-kya "npx --no-install @shield-agent/kya@0.
|
|
3
|
+
Preferred path is Droid's own CLI: `droid mcp add shield-kya "npx --no-install @shield-agent/kya@0.7.0 serve-mcp --stdio" --env KYA_BASE_URL=https://shield-agent.com --env KYA_API_KEY=$KYA_API_KEY --env KYA_HOST=ide`.
|
|
4
4
|
|
|
5
5
|
`mcp.example.json` shows the expected on-disk shape (`~/.factory/mcp.json`) — **schema not yet verified against a live Droid install**; treat as a starting point and prefer `droid mcp add`.
|
|
6
6
|
|
package/droid/mcp.example.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"mcpServers": {
|
|
3
3
|
"shield-kya": {
|
|
4
4
|
"command": "npx",
|
|
5
|
-
"args": ["--no-install", "@shield-agent/kya@0.
|
|
5
|
+
"args": ["--no-install", "@shield-agent/kya@0.7.0", "serve-mcp", "--stdio"],
|
|
6
6
|
"env": {
|
|
7
7
|
"KYA_BASE_URL": "https://shield-agent.com",
|
|
8
8
|
"KYA_API_KEY": "${KYA_API_KEY}",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"mcpServers": {
|
|
3
3
|
"shield-kya": {
|
|
4
4
|
"command": "npx",
|
|
5
|
-
"args": ["--no-install", "@shield-agent/kya@0.
|
|
5
|
+
"args": ["--no-install", "@shield-agent/kya@0.7.0", "serve-mcp", "--stdio"],
|
|
6
6
|
"env": {
|
|
7
7
|
"KYA_BASE_URL": "https://shield-agent.com",
|
|
8
8
|
"KYA_API_KEY": "${KYA_API_KEY}",
|
package/grok/README.md
CHANGED
|
@@ -40,7 +40,7 @@ chat = client.chat.create(
|
|
|
40
40
|
There is no grok.com stdio path. For a local agent host use the same stdio launch as Claude:
|
|
41
41
|
|
|
42
42
|
```bash
|
|
43
|
-
npx --no-install @shield-agent/kya@0.
|
|
43
|
+
npx --no-install @shield-agent/kya@0.7.0 serve-mcp --stdio
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
Env: `KYA_BASE_URL`, `KYA_API_KEY`, `KYA_HOST`. Codex and Gemini example configs in this package show the full snippets.
|
package/kilo/kilo.example.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"mcp": {
|
|
3
3
|
"shield-kya": {
|
|
4
4
|
"type": "local",
|
|
5
|
-
"command": ["npx", "--no-install", "@shield-agent/kya@0.
|
|
5
|
+
"command": ["npx", "--no-install", "@shield-agent/kya@0.7.0", "serve-mcp", "--stdio"],
|
|
6
6
|
"enabled": true,
|
|
7
7
|
"environment": {
|
|
8
8
|
"KYA_BASE_URL": "https://shield-agent.com",
|
package/kimi/mcp.example.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"mcpServers": {
|
|
3
3
|
"shield-kya": {
|
|
4
4
|
"command": "npx",
|
|
5
|
-
"args": ["--no-install", "@shield-agent/kya@0.
|
|
5
|
+
"args": ["--no-install", "@shield-agent/kya@0.7.0", "serve-mcp", "--stdio"],
|
|
6
6
|
"env": {
|
|
7
7
|
"KYA_BASE_URL": "https://shield-agent.com",
|
|
8
8
|
"KYA_API_KEY": "${KYA_API_KEY}",
|
package/kiro/mcp.example.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"mcpServers": {
|
|
3
3
|
"shield-kya": {
|
|
4
4
|
"command": "npx",
|
|
5
|
-
"args": ["--no-install", "@shield-agent/kya@0.
|
|
5
|
+
"args": ["--no-install", "@shield-agent/kya@0.7.0", "serve-mcp", "--stdio"],
|
|
6
6
|
"env": {
|
|
7
7
|
"KYA_BASE_URL": "https://shield-agent.com",
|
|
8
8
|
"KYA_API_KEY": "${KYA_API_KEY}",
|
package/manifest.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"manifest_version": "0.3",
|
|
3
3
|
"name": "shield-kya",
|
|
4
4
|
"display_name": "Shield KYA",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.7.0",
|
|
6
6
|
"description": "Know Your Agent MCP gate: ALLOW / DENY / REQUIRE_APPROVE. Sole PEP is Shield.",
|
|
7
7
|
"long_description": "Local Claude Desktop extension that runs the packaged `dist/cli.js serve-mcp --stdio` against your Shield control plane (local or https://shield-agent.com). Tools evaluate policy, ingest session risk, and open Hold tickets. They never execute irreversible side effects.",
|
|
8
8
|
"author": {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"mcpServers": {
|
|
3
3
|
"shield-kya": {
|
|
4
4
|
"command": "npx",
|
|
5
|
-
"args": ["--no-install", "@shield-agent/kya@0.
|
|
5
|
+
"args": ["--no-install", "@shield-agent/kya@0.7.0", "serve-mcp", "--stdio"],
|
|
6
6
|
"env": {
|
|
7
7
|
"KYA_BASE_URL": "https://shield-agent.com",
|
|
8
8
|
"KYA_API_KEY": "${KYA_API_KEY}",
|
package/mcp.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"shield-kya": {
|
|
4
4
|
"description": "Know Your Agent local MCP gate: wrap-before-write, named-agent registry, Hold/Clear.",
|
|
5
5
|
"command": "npx",
|
|
6
|
-
"args": ["--no-install", "@shield-agent/kya@0.
|
|
6
|
+
"args": ["--no-install", "@shield-agent/kya@0.7.0", "serve-mcp", "--stdio"],
|
|
7
7
|
"env": {
|
|
8
8
|
"KYA_BASE_URL": "${KYA_BASE_URL}",
|
|
9
9
|
"KYA_API_KEY": "${KYA_API_KEY}",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
# --- Local stdio (OSS) ---
|
|
12
12
|
[mcp_servers.shield-kya]
|
|
13
13
|
command = "npx"
|
|
14
|
-
args = ["--no-install", "@shield-agent/kya@0.
|
|
14
|
+
args = ["--no-install", "@shield-agent/kya@0.7.0", "serve-mcp", "--stdio"]
|
|
15
15
|
startup_timeout_sec = 20
|
|
16
16
|
env_vars = ["KYA_BASE_URL", "KYA_API_KEY", "KYA_HOST", "KYA_AGENT_ID"]
|
|
17
17
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"mcp": {
|
|
3
3
|
"shield-kya": {
|
|
4
4
|
"type": "local",
|
|
5
|
-
"command": ["npx", "--no-install", "@shield-agent/kya@0.
|
|
5
|
+
"command": ["npx", "--no-install", "@shield-agent/kya@0.7.0", "serve-mcp", "--stdio"],
|
|
6
6
|
"enabled": true,
|
|
7
7
|
"environment": {
|
|
8
8
|
"KYA_BASE_URL": "https://shield-agent.com",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shield-agent/kya",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Know Your Agent light CLI + local MCP gate (provider-agnostic, zero vertical packs required).",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
},
|
|
21
21
|
"files": [
|
|
22
22
|
"dist",
|
|
23
|
+
"catalog",
|
|
23
24
|
"README.md",
|
|
24
25
|
"server.json",
|
|
25
26
|
"LICENSE",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"mcpServers": {
|
|
3
3
|
"shield-kya": {
|
|
4
4
|
"command": "npx",
|
|
5
|
-
"args": ["--no-install", "@shield-agent/kya@0.
|
|
5
|
+
"args": ["--no-install", "@shield-agent/kya@0.7.0", "serve-mcp", "--stdio"],
|
|
6
6
|
"env": {
|
|
7
7
|
"KYA_BASE_URL": "https://shield-agent.com",
|
|
8
8
|
"KYA_API_KEY": "${KYA_API_KEY}",
|
package/server.json
CHANGED
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
"url": "https://github.com/The-Pixel-Boys/shield-kya",
|
|
8
8
|
"source": "github"
|
|
9
9
|
},
|
|
10
|
-
"version": "0.
|
|
10
|
+
"version": "0.7.0",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"identifier": "@shield-agent/kya",
|
|
15
|
-
"version": "0.
|
|
15
|
+
"version": "0.7.0",
|
|
16
16
|
"transport": {
|
|
17
17
|
"type": "stdio"
|
|
18
18
|
},
|