Skip to content

Commit 61c42df

Browse files
committed
┌─────────────────────────────┬────────────────────────────────────────────────────────────┐
│ Issue │ Fix │ ├─────────────────────────────┼────────────────────────────────────────────────────────────┤ │ 001 cli_flags tests │ Replaced with deprecation shim test │ ├─────────────────────────────┼────────────────────────────────────────────────────────────┤ │ 002 hai-mcp integration │ Updated to spawn haisdk mcp instead of hai-mcp │ ├─────────────────────────────┼────────────────────────────────────────────────────────────┤ │ 003 contract snapshot stale │ Updated version 0.9.0 → 0.9.1 │ ├─────────────────────────────┼────────────────────────────────────────────────────────────┤ │ 004 rust.yml --features cli │ Removed, added jacs-cli + jacs-mcp test steps │ ├─────────────────────────────┼────────────────────────────────────────────────────────────┤ │ 005 release-cli.yml │ Builds jacs-cli, removed jacs-mcp packaging/smoke tests │ ├─────────────────────────────┼────────────────────────────────────────────────────────────┤ │ 006 release-crate.yml │ Added jacs-cli to version check + publish │ ├─────────────────────────────┼────────────────────────────────────────────────────────────┤ │ 007 setup.sh/.mcp.json │ Updated for unified jacs mcp │ ├─────────────────────────────┼────────────────────────────────────────────────────────────┤ │ 008 empty http feature │ Removed http = [] stub from jacs-mcp │ ├─────────────────────────────┼────────────────────────────────────────────────────────────┤ │ 009 CLI flags │ N/A (stdio-only per security directive) │ ├─────────────────────────────┼────────────────────────────────────────────────────────────┤ │ 010 deprecation subcommands │ Added hidden jacs mcp install and jacs mcp run │ ├─────────────────────────────┼────────────────────────────────────────────────────────────┤ │ 011 compiler warnings │ Fixed all 12 (9 auto-fix + 2 manual + attestation feature) │ ├─────────────────────────────┼────────────────────────────────────────────────────────────┤ │ 012 jacs version pin │ Deferred (requires crates.io publish) │ ├─────────────────────────────┼────────────────────────────────────────────────────────────┤ │ 013 jacs-mcp integration.rs │ Updated to spawn jacs mcp via jacs-cli │ ├─────────────────────────────┼────────────────────────────────────────────────────────────┤ │ 014 edition 2024 │ No action needed (consistent) │ └─────────────────────────────┴────────────────────────────────────────────────────────────┘
1 parent f107c8f commit 61c42df

File tree

10 files changed

+116
-78
lines changed

10 files changed

+116
-78
lines changed

.github/workflows/release-cli.yml

Lines changed: 21 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,14 @@ jobs:
2525
- name: Check Cargo.toml versions match tag
2626
run: |
2727
TAG_VERSION="${{ steps.extract.outputs.version }}"
28-
JACS_VERSION=$(grep '^version = ' jacs/Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/')
29-
MCP_VERSION=$(grep '^version = ' jacs-mcp/Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/')
30-
echo "jacs version: $JACS_VERSION, tag: $TAG_VERSION"
31-
echo "jacs-mcp version: $MCP_VERSION, tag: $TAG_VERSION"
32-
if [ "$JACS_VERSION" != "$TAG_VERSION" ]; then
33-
echo "::error::Version mismatch! jacs/Cargo.toml has $JACS_VERSION but tag is $TAG_VERSION"
34-
exit 1
35-
fi
36-
if [ "$MCP_VERSION" != "$TAG_VERSION" ]; then
37-
echo "::error::Version mismatch! jacs-mcp/Cargo.toml has $MCP_VERSION but tag is $TAG_VERSION"
38-
exit 1
39-
fi
28+
for dir in jacs jacs-mcp jacs-cli; do
29+
CARGO_VERSION=$(grep '^version = ' $dir/Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/')
30+
echo "$dir version: $CARGO_VERSION, tag: $TAG_VERSION"
31+
if [ "$CARGO_VERSION" != "$TAG_VERSION" ]; then
32+
echo "::error::Version mismatch! $dir/Cargo.toml has $CARGO_VERSION but tag is $TAG_VERSION"
33+
exit 1
34+
fi
35+
done
4036
4137
build:
4238
needs: verify-version
@@ -69,7 +65,6 @@ jobs:
6965
env:
7066
VERSION: ${{ needs.verify-version.outputs.version }}
7167
CLI_ASSET_NAME: jacs-cli-${{ needs.verify-version.outputs.version }}-${{ matrix.asset_suffix }}
72-
MCP_ASSET_NAME: jacs-mcp-${{ needs.verify-version.outputs.version }}-${{ matrix.asset_suffix }}
7368
steps:
7469
- uses: actions/checkout@v4
7570
if: runner.os != 'Windows'
@@ -104,6 +99,7 @@ jobs:
10499
$_ -eq "$prefix/jacs/LICENSE" -or
105100
$_ -eq "$prefix/jacs/build.rs" -or
106101
$_ -like "$prefix/jacs/benches/*" -or
102+
$_ -eq "$prefix/jacs-cli/Cargo.toml" -or
107103
$_ -eq "$prefix/jacs-mcp/Cargo.toml" -or
108104
$_ -eq "$prefix/jacs-mcp/README.md" -or
109105
$_ -eq "$prefix/jacsnpm/Cargo.toml" -or
@@ -115,6 +111,7 @@ jobs:
115111
$_ -like "$prefix/binding-core/src/*" -or
116112
$_ -like "$prefix/jacs/src/*" -or
117113
$_ -like "$prefix/jacs/schemas/*" -or
114+
$_ -like "$prefix/jacs-cli/src/*" -or
118115
$_ -like "$prefix/jacs-mcp/src/*"
119116
}
120117
@@ -132,49 +129,39 @@ jobs:
132129

133130
- name: Build binaries
134131
run: |
135-
cargo build --release -p jacs --features cli --target ${{ matrix.target }}
136-
cargo build --release -p jacs-mcp --target ${{ matrix.target }}
132+
cargo build --release -p jacs-cli --target ${{ matrix.target }}
137133
138134
- name: Smoke test (Unix)
139135
if: runner.os != 'Windows'
140136
run: |
141137
./target/${{ matrix.target }}/release/jacs --version
142-
./target/${{ matrix.target }}/release/jacs-mcp --help > /dev/null
143138
144139
- name: Smoke test (Windows)
145140
if: runner.os == 'Windows'
146141
shell: pwsh
147142
run: |
148143
.\target\${{ matrix.target }}\release\jacs.exe --version
149-
.\target\${{ matrix.target }}\release\jacs-mcp.exe --help | Out-Null
150144
151145
- name: Package (Unix)
152146
if: runner.os != 'Windows'
153147
run: |
154148
cp target/${{ matrix.target }}/release/jacs jacs-cli
155-
cp target/${{ matrix.target }}/release/jacs-mcp jacs-mcp
156149
tar czf ${CLI_ASSET_NAME}.tar.gz jacs-cli
157-
tar czf ${MCP_ASSET_NAME}.tar.gz jacs-mcp
158150
shasum -a 256 ${CLI_ASSET_NAME}.tar.gz > ${CLI_ASSET_NAME}.tar.gz.sha256
159-
shasum -a 256 ${MCP_ASSET_NAME}.tar.gz > ${MCP_ASSET_NAME}.tar.gz.sha256
160151
161152
- name: Package (Windows)
162153
if: runner.os == 'Windows'
163154
shell: pwsh
164155
run: |
165156
Copy-Item "target/${{ matrix.target }}/release/jacs.exe" "jacs-cli.exe"
166-
Copy-Item "target/${{ matrix.target }}/release/jacs-mcp.exe" "jacs-mcp.exe"
167157
Compress-Archive -Path "jacs-cli.exe" -DestinationPath "${env:CLI_ASSET_NAME}.zip"
168-
Compress-Archive -Path "jacs-mcp.exe" -DestinationPath "${env:MCP_ASSET_NAME}.zip"
169158
Get-FileHash "${env:CLI_ASSET_NAME}.zip" -Algorithm SHA256 | ForEach-Object { "$($_.Hash.ToLower()) ${env:CLI_ASSET_NAME}.zip" } | Out-File "${env:CLI_ASSET_NAME}.zip.sha256" -Encoding ascii
170-
Get-FileHash "${env:MCP_ASSET_NAME}.zip" -Algorithm SHA256 | ForEach-Object { "$($_.Hash.ToLower()) ${env:MCP_ASSET_NAME}.zip" } | Out-File "${env:MCP_ASSET_NAME}.zip.sha256" -Encoding ascii
171159
172160
- uses: actions/upload-artifact@v4
173161
with:
174162
name: binaries-${{ matrix.asset_suffix }}
175163
path: |
176164
${{ env.CLI_ASSET_NAME }}.*
177-
${{ env.MCP_ASSET_NAME }}.*
178165
179166
release:
180167
needs: [verify-version, build]
@@ -199,31 +186,31 @@ jobs:
199186
body: |
200187
## JACS CLI v${{ needs.verify-version.outputs.version }}
201188
202-
Prebuilt binaries for:
203-
- `jacs` (CLI)
204-
- `jacs-mcp` (MCP server)
189+
Unified `jacs` binary with CLI + built-in MCP server.
205190
206191
### Install
207192
208-
Download the binary for your platform, extract, and add to your PATH:
193+
**From crates.io:**
194+
```bash
195+
cargo install jacs-cli
196+
```
209197
198+
**From prebuilt binary:**
210199
```bash
211200
# macOS (Apple Silicon)
212201
curl -LO https://github.com/HumanAssisted/JACS/releases/download/cli/v${{ needs.verify-version.outputs.version }}/jacs-cli-${{ needs.verify-version.outputs.version }}-darwin-arm64.tar.gz
213202
tar xzf jacs-cli-*.tar.gz
214-
sudo mv jacs-cli /usr/local/bin/
203+
sudo mv jacs-cli /usr/local/bin/jacs
215204
216205
# Linux (x86_64)
217206
curl -LO https://github.com/HumanAssisted/JACS/releases/download/cli/v${{ needs.verify-version.outputs.version }}/jacs-cli-${{ needs.verify-version.outputs.version }}-linux-x64.tar.gz
218207
tar xzf jacs-cli-*.tar.gz
219-
sudo mv jacs-cli /usr/local/bin/
208+
sudo mv jacs-cli /usr/local/bin/jacs
220209
```
221210
222-
Install MCP directly from the CLI (uses these platform assets by default):
223-
211+
**Start MCP server (stdio):**
224212
```bash
225-
jacs mcp install
226-
jacs mcp run
213+
jacs mcp
227214
```
228215
229216
### Verify checksums

.github/workflows/release-crate.yml

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,18 @@ jobs:
2222
TAG="${GITHUB_REF#refs/tags/crate/v}"
2323
echo "version=$TAG" >> $GITHUB_OUTPUT
2424
25-
- name: Check Cargo.toml version matches tag (jacs + jacs-mcp)
25+
- name: Check Cargo.toml version matches tag (jacs + jacs-mcp + jacs-cli)
2626
run: |
2727
TAG_VERSION="${{ steps.extract.outputs.version }}"
28-
for dir in jacs jacs-mcp; do
28+
for dir in jacs jacs-mcp jacs-cli; do
2929
CARGO_VERSION=$(grep '^version = ' $dir/Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/')
3030
echo "$dir Cargo version: $CARGO_VERSION, tag: $TAG_VERSION"
3131
if [ "$CARGO_VERSION" != "$TAG_VERSION" ]; then
3232
echo "::error::Version mismatch! $dir/Cargo.toml has $CARGO_VERSION but tag is $TAG_VERSION"
3333
exit 1
3434
fi
3535
done
36-
echo "Version match confirmed for jacs and jacs-mcp"
36+
echo "Version match confirmed for jacs, jacs-mcp, and jacs-cli"
3737
3838
publish:
3939
needs: verify-version
@@ -51,3 +51,8 @@ jobs:
5151
working-directory: jacs-mcp
5252
continue-on-error: true
5353
run: cargo publish --token ${{ secrets.CRATES_IO_TOKEN }}
54+
55+
- name: Publish jacs-cli to crates.io
56+
working-directory: jacs-cli
57+
continue-on-error: true
58+
run: cargo publish --token ${{ secrets.CRATES_IO_TOKEN }}

.github/workflows/rust.yml

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ on:
66
tags: ["v*"]
77
paths:
88
- "jacs/**"
9+
- "jacs-cli/**"
10+
- "jacs-mcp/**"
911
- "binding-core/**"
1012
- "Cargo.toml"
1113
- "Cargo.lock"
@@ -14,6 +16,8 @@ on:
1416
branches: ["main"]
1517
paths:
1618
- "jacs/**"
19+
- "jacs-cli/**"
20+
- "jacs-mcp/**"
1721
- "binding-core/**"
1822
- "Cargo.toml"
1923
- "Cargo.lock"
@@ -56,11 +60,13 @@ jobs:
5660
5761
- name: Run quick Rust test suite
5862
run: |
59-
cargo test -p jacs --verbose --lib --features cli
63+
cargo test -p jacs --verbose --lib
6064
cargo test -p jacs --verbose --test pq2025_tests
6165
cargo test -p jacs --verbose --test cross_language_tests
6266
cargo test -p jacs --verbose --test structured_logging_tests
6367
cargo test -p jacs-binding-core --verbose
68+
cargo build -p jacs-cli
69+
cargo test -p jacs-mcp --verbose
6470
6571
full-jacs-release:
6672
name: Full jacs suite (${{ matrix.os }})
@@ -90,8 +96,11 @@ jobs:
9096
9197
- name: Run full jacs tests
9298
run: |
93-
cargo test -p jacs --verbose --features cli
99+
cargo test -p jacs --verbose
94100
cargo test -p jacs-binding-core --verbose
101+
cargo build -p jacs-cli
102+
cargo test -p jacs-mcp --verbose
103+
cargo test -p jacs-cli --verbose
95104
96105
full-jacs-nightly:
97106
name: Full jacs suite (nightly ubuntu)
@@ -114,5 +123,8 @@ jobs:
114123
115124
- name: Run nightly full Rust tests
116125
run: |
117-
cargo test -p jacs --verbose --features cli
126+
cargo test -p jacs --verbose
118127
cargo test -p jacs-binding-core --verbose
128+
cargo build -p jacs-cli
129+
cargo test -p jacs-mcp --verbose
130+
cargo test -p jacs-cli --verbose

jacs-cli/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ name = "jacs"
1717
path = "src/main.rs"
1818

1919
[features]
20-
default = ["mcp"]
20+
default = ["mcp", "attestation"]
2121
mcp = ["dep:jacs-mcp"]
22+
attestation = ["jacs/attestation"]
2223

2324
[dependencies]
2425
jacs = { path = "../jacs" }

jacs-cli/src/main.rs

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use jacs::{load_agent, load_agent_with_dns_policy};
1919
use rpassword::read_password;
2020
use std::env;
2121
use std::error::Error;
22-
use std::path::{Path, PathBuf};
22+
use std::path::Path;
2323
use std::process;
2424

2525
const CLI_PASSWORD_FILE_ENV: &str = "JACS_PASSWORD_FILE";
@@ -693,7 +693,17 @@ pub fn main() -> Result<(), Box<dyn Error>> {
693693
)
694694
.subcommand(
695695
Command::new("mcp")
696-
.about("Start the built-in JACS MCP server (stdio transport)"),
696+
.about("Start the built-in JACS MCP server (stdio transport)")
697+
.subcommand(
698+
Command::new("install")
699+
.about("Deprecated: MCP is now built into the jacs binary")
700+
.hide(true)
701+
)
702+
.subcommand(
703+
Command::new("run")
704+
.about("Deprecated: use `jacs mcp` directly")
705+
.hide(true)
706+
),
697707
)
698708
.subcommand(
699709
Command::new("a2a")
@@ -1260,7 +1270,7 @@ pub fn main() -> Result<(), Box<dyn Error>> {
12601270
let filename = create_matches.get_one::<String>("filename");
12611271
let outputfilename = create_matches.get_one::<String>("output");
12621272
let directory = create_matches.get_one::<String>("directory");
1263-
let verbose = *create_matches.get_one::<bool>("verbose").unwrap_or(&false);
1273+
let _verbose = *create_matches.get_one::<bool>("verbose").unwrap_or(&false);
12641274
let no_save = *create_matches.get_one::<bool>("no-save").unwrap_or(&false);
12651275
let agentfile = create_matches.get_one::<String>("agent-file");
12661276
let schema = create_matches.get_one::<String>("schema");
@@ -1271,8 +1281,8 @@ pub fn main() -> Result<(), Box<dyn Error>> {
12711281

12721282
let mut agent: Agent = load_agent(agentfile.cloned()).expect("REASON");
12731283

1274-
let attachment_links = agent.parse_attachement_arg(attachments);
1275-
create_documents(
1284+
let _attachment_links = agent.parse_attachement_arg(attachments);
1285+
let _ = create_documents(
12761286
&mut agent,
12771287
filename,
12781288
directory,
@@ -1289,7 +1299,7 @@ pub fn main() -> Result<(), Box<dyn Error>> {
12891299
let new_filename = create_matches.get_one::<String>("new").unwrap();
12901300
let original_filename = create_matches.get_one::<String>("filename").unwrap();
12911301
let outputfilename = create_matches.get_one::<String>("output");
1292-
let verbose = *create_matches.get_one::<bool>("verbose").unwrap_or(&false);
1302+
let _verbose = *create_matches.get_one::<bool>("verbose").unwrap_or(&false);
12931303
let no_save = *create_matches.get_one::<bool>("no-save").unwrap_or(&false);
12941304
let agentfile = create_matches.get_one::<String>("agent-file");
12951305
let schema = create_matches.get_one::<String>("schema");
@@ -1319,7 +1329,7 @@ pub fn main() -> Result<(), Box<dyn Error>> {
13191329
let agentfile = create_matches.get_one::<String>("agent-file");
13201330
let mut agent: Agent = load_agent(agentfile.cloned()).expect("REASON");
13211331
let schema = create_matches.get_one::<String>("schema");
1322-
let no_save = *create_matches.get_one::<bool>("no-save").unwrap_or(&false);
1332+
let _no_save = *create_matches.get_one::<bool>("no-save").unwrap_or(&false);
13231333

13241334
// Use updated set_file_list with storage
13251335
sign_documents(&mut agent, schema, filename, directory)?;
@@ -1332,7 +1342,7 @@ pub fn main() -> Result<(), Box<dyn Error>> {
13321342
let schema = create_matches.get_one::<String>("schema");
13331343

13341344
// Use updated set_file_list with storage
1335-
let files: Vec<String> = default_set_file_list(filename, directory, None)
1345+
let _files: Vec<String> = default_set_file_list(filename, directory, None)
13361346
.expect("Failed to determine file list");
13371347
check_agreement(&mut agent, schema, filename, directory)?;
13381348
}
@@ -1352,13 +1362,13 @@ pub fn main() -> Result<(), Box<dyn Error>> {
13521362

13531363
let mut agent: Agent = load_agent(agentfile.cloned()).expect("REASON");
13541364
// Use updated set_file_list with storage
1355-
create_agreement(&mut agent, agentids, filename, schema, no_save, directory);
1365+
let _ = create_agreement(&mut agent, agentids, filename, schema, no_save, directory);
13561366
}
13571367

13581368
Some(("verify", verify_matches)) => {
13591369
let filename = verify_matches.get_one::<String>("filename");
13601370
let directory = verify_matches.get_one::<String>("directory");
1361-
let verbose = *verify_matches.get_one::<bool>("verbose").unwrap_or(&false);
1371+
let _verbose = *verify_matches.get_one::<bool>("verbose").unwrap_or(&false);
13621372
let agentfile = verify_matches.get_one::<String>("agent-file");
13631373
let mut agent: Agent = load_agent(agentfile.cloned()).expect("REASON");
13641374
let schema = verify_matches.get_one::<String>("schema");
@@ -1369,12 +1379,12 @@ pub fn main() -> Result<(), Box<dyn Error>> {
13691379
Some(("extract", extract_matches)) => {
13701380
let filename = extract_matches.get_one::<String>("filename");
13711381
let directory = extract_matches.get_one::<String>("directory");
1372-
let verbose = *extract_matches.get_one::<bool>("verbose").unwrap_or(&false);
1382+
let _verbose = *extract_matches.get_one::<bool>("verbose").unwrap_or(&false);
13731383
let agentfile = extract_matches.get_one::<String>("agent-file");
13741384
let mut agent: Agent = load_agent(agentfile.cloned()).expect("REASON");
13751385
let schema = extract_matches.get_one::<String>("schema");
13761386
// Use updated set_file_list with storage
1377-
let files: Vec<String> = default_set_file_list(filename, directory, None)
1387+
let _files: Vec<String> = default_set_file_list(filename, directory, None)
13781388
.expect("Failed to determine file list");
13791389
// extract the contents but do not save
13801390
extract_documents(&mut agent, schema, filename, directory)?;
@@ -1448,11 +1458,25 @@ pub fn main() -> Result<(), Box<dyn Error>> {
14481458
_ => println!("please enter subcommand see jacs key --help"),
14491459
},
14501460
#[cfg(feature = "mcp")]
1451-
Some(("mcp", _mcp_matches)) => {
1452-
let agent = jacs_mcp::load_agent_from_config_env()?;
1453-
let server = jacs_mcp::JacsMcpServer::new(agent);
1454-
let rt = tokio::runtime::Runtime::new()?;
1455-
rt.block_on(jacs_mcp::serve_stdio(server))?;
1461+
Some(("mcp", mcp_matches)) => {
1462+
match mcp_matches.subcommand() {
1463+
Some(("install", _)) => {
1464+
eprintln!("`jacs mcp install` is no longer needed.");
1465+
eprintln!("MCP is built into the jacs binary. Use `jacs mcp` to serve.");
1466+
process::exit(0);
1467+
}
1468+
Some(("run", _)) => {
1469+
eprintln!("`jacs mcp run` is no longer needed.");
1470+
eprintln!("Use `jacs mcp` directly to start the MCP server.");
1471+
process::exit(0);
1472+
}
1473+
_ => {
1474+
let agent = jacs_mcp::load_agent_from_config_env()?;
1475+
let server = jacs_mcp::JacsMcpServer::new(agent);
1476+
let rt = tokio::runtime::Runtime::new()?;
1477+
rt.block_on(jacs_mcp::serve_stdio(server))?;
1478+
}
1479+
}
14561480
}
14571481
#[cfg(not(feature = "mcp"))]
14581482
Some(("mcp", _)) => {

jacs-mcp/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ categories = ["cryptography", "development-tools"]
1515
[features]
1616
default = ["mcp", "attestation"]
1717
mcp = ["dep:rmcp", "dep:tokio", "jacs/mcp-server"]
18-
http = []
1918
attestation = ["jacs/attestation", "jacs-binding-core/attestation"]
2019

2120
[dependencies]

jacs-mcp/contract/jacs-mcp-contract.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"server": {
44
"name": "jacs-mcp",
55
"title": "JACS MCP Server",
6-
"version": "0.9.0",
6+
"version": "0.9.1",
77
"website_url": "https://humanassisted.github.io/JACS/",
88
"instructions": "This MCP server provides data provenance and cryptographic signing for agent state files and agent-to-agent messaging. Agent state tools: jacs_sign_state (sign files), jacs_verify_state (verify integrity), jacs_load_state (load with verification), jacs_update_state (update and re-sign), jacs_list_state (list signed docs), jacs_adopt_state (adopt external files). Messaging tools: jacs_message_send (create and sign a message), jacs_message_update (update and re-sign a message), jacs_message_agree (co-sign/agree to a message), jacs_message_receive (verify and extract a received message). Agent management: jacs_create_agent (create new agent with keys), jacs_reencrypt_key (rotate private key password). A2A artifacts: jacs_wrap_a2a_artifact (sign artifact with provenance), jacs_verify_a2a_artifact (verify wrapped artifact), jacs_assess_a2a_agent (assess remote agent trust level). A2A discovery: jacs_export_agent_card (export Agent Card), jacs_generate_well_known (generate .well-known documents), jacs_export_agent (export full agent JSON). Trust store: jacs_trust_agent (add agent to trust store), jacs_untrust_agent (remove from trust store, requires JACS_MCP_ALLOW_UNTRUST=true), jacs_list_trusted_agents (list all trusted agent IDs), jacs_is_trusted (check if agent is trusted), jacs_get_trusted_agent (get trusted agent JSON). Attestation: jacs_attest_create (create signed attestation with claims), jacs_attest_verify (verify attestation, optionally with evidence checks), jacs_attest_lift (lift signed document into attestation), jacs_attest_export_dsse (export attestation as DSSE envelope). Security: jacs_audit (read-only security audit and health checks)."
99
},

0 commit comments

Comments
 (0)