sealnet-mcp 0.2.4 → 0.2.5
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/README.md +1 -1
- package/dist/cli.cjs +8 -5
- package/dist/cli.js +8 -5
- package/dist/index.cjs +8 -5
- package/dist/index.d.cts +552 -94
- package/dist/index.d.ts +552 -94
- package/dist/index.js +8 -5
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@ Model Context Protocol (MCP) server for **SEAL**.
|
|
|
8
8
|
|
|
9
9
|
When an MCP-connected AI agent (Claude Desktop, Cursor, Cline, etc.) creates a SEAL via this server:
|
|
10
10
|
|
|
11
|
-
- **handoff mode (default)**: the share link (the key is in its fragment, there is no password) is delivered to the human user via **system clipboard** (primary) or **0o600 local file** (fallback when clipboard is unavailable — headless, SSH, WSL without display). The `tool_result` returned to the model contains **only** an opaque handle and a human-readable receipt. The
|
|
11
|
+
- **handoff mode (default)**: the share link (the key is in its fragment, there is no password) is delivered to the human user via **system clipboard** (primary) or **0o600 local file** (fallback when clipboard is unavailable — headless, SSH, WSL without display). The `tool_result` returned to the model contains **only** an opaque handle and a human-readable receipt. The link is never written into the conversation; on the file channel the receipt names the file, and an agent that can read files on that machine can read it.
|
|
12
12
|
- **forward mode (explicit opt-in)**: model receives `{ handle, share_url, expires_at, max_reads, mode }` in `tool_result`; the link opens only with the recipient's X25519 key. Requires short TTL (≤30m), `max_reads=1`, mandatory `to` (recipient pubkey). Every forward is audit-logged in the encrypted state file.
|
|
13
13
|
|
|
14
14
|
## Tool surface
|
package/dist/cli.cjs
CHANGED
|
@@ -11371,13 +11371,13 @@ var seal_mcp_v1_default = {
|
|
|
11371
11371
|
progress: "When a `tools/call` carries `_meta.progressToken`, `seal_share` and `seal_open mode=file` send `notifications/progress` with `progress` = ciphertext bytes done (upload: confirmed by storage) and `total` = ciphertext bytes in all; at most one per second, `progress` strictly increasing, the last one at `progress = total`."
|
|
11372
11372
|
},
|
|
11373
11373
|
server_instructions: {
|
|
11374
|
-
text: "SEAL moves files and secrets between people and agents without their content entering this conversation. When someone wants a file, folder or secret sent to them, to another machine or to another agent, call seal_share with its path and do not open, print or Read it first. When you need an API key, password, file or folder from the user, or they offer or ask how to give you one, call seal_request right away instead of explaining other ways or asking them to paste or upload it. Open a SEAL link someone gave you with seal_open (mode=file for secrets and large files).",
|
|
11374
|
+
text: "SEAL moves files and secrets between people and agents without their content entering this conversation. When someone wants a file, folder or secret sent to them, to another machine or to another agent, call seal_share with its path and do not open, print or Read it first. When you need an API key, password, file or folder from the user, or they offer or ask how to give you one, call seal_request right away instead of explaining other ways or asking them to paste or upload it. Open a SEAL link someone gave you with seal_open (mode=file for secrets and large files). Never read or print a SEAL handoff file.",
|
|
11375
11375
|
note: "The `instructions` of the `initialize` result (SPEC-AGENTS \xA78.1). Hosts that defer MCP tools behind a tool search (Claude Code) show the model only tool names until it searches, but put these instructions into the system prompt: this is the one text a model reads before it decides to look for a tool, or reads the file it was asked to send."
|
|
11376
11376
|
},
|
|
11377
11377
|
tools: {
|
|
11378
11378
|
seal_share: {
|
|
11379
11379
|
title: "Share a file via SEAL",
|
|
11380
|
-
description: "Give the user or another agent a file or a secret WITHOUT it passing through this chat. Works for
|
|
11380
|
+
description: "Give the user or another agent a file or a secret WITHOUT it passing through this chat. Works for large files (folders, dumps, exports, builds, videos \u2014 up to 1 GB free, more after one card payment by the user). Default mode `handoff`: the link goes to the user's clipboard and you get a handle. Where there is no clipboard it goes to a 0600 file and you get its path: do not read that file and do not print it. Mode `forward`: a link only the holder of the given X25519 key can open \u2014 use it for another agent. Never paste secrets or huge content into the chat instead.",
|
|
11381
11381
|
annotations: { destructiveHint: false, openWorldHint: true },
|
|
11382
11382
|
input: {
|
|
11383
11383
|
properties: {
|
|
@@ -11427,7 +11427,9 @@ var seal_mcp_v1_default = {
|
|
|
11427
11427
|
expires_at: { type: "string", format: "date-time", description: "ISO 8601 UTC expiry timestamp." }
|
|
11428
11428
|
},
|
|
11429
11429
|
MUST_NOT_contain: ["share_url", "url", "password", "passphrase", "link_key", "owner_token"],
|
|
11430
|
-
rationale: "Anything in this object reaches the model. Any field that lets the model reconstruct or re-issue the share capability defeats handoff mode."
|
|
11430
|
+
rationale: "Anything in this object reaches the model. Any field that lets the model reconstruct or re-issue the share capability defeats handoff mode.",
|
|
11431
|
+
receipt_clipboard: "The seal link is on your clipboard. Paste it to the recipient.",
|
|
11432
|
+
receipt_file: "The seal link is in {file} (mode 0600, removed automatically later). Give it to the recipient. Anyone who can read files on this machine as this user, this agent included, can read it. In a cloud or container session prefer mode=forward to the recipient\u2019s key."
|
|
11431
11433
|
},
|
|
11432
11434
|
output_forward: {
|
|
11433
11435
|
type: "object",
|
|
@@ -13363,6 +13365,7 @@ function guessMimeFromName(name) {
|
|
|
13363
13365
|
}
|
|
13364
13366
|
var VALID_TTL = ["5m", "30m", "1h", "1d", "7d"];
|
|
13365
13367
|
var EXPIRE_DEFAULT = seal_mcp_v1_default.tools.seal_share.expire_default;
|
|
13368
|
+
var HANDOFF_OUTPUT = seal_mcp_v1_default.tools.seal_share.output_handoff;
|
|
13366
13369
|
var TIER_BYTES2 = limits_default2.limits.TIER_BYTES;
|
|
13367
13370
|
var PAYMENT_RECEIPT = "The file is larger than 1 GB. Show the user the payment link; the upload continues after payment. Then call seal_share with `payment` set to this handle.";
|
|
13368
13371
|
function defaultExpire(mode, size) {
|
|
@@ -13763,7 +13766,7 @@ async function deliver(ctx, deps, { mode, recipientPub, expireMs }, { handle, op
|
|
|
13763
13766
|
appendAudit(ctx, "seal_share", handle, mode);
|
|
13764
13767
|
delete ctx.state.pending[handle];
|
|
13765
13768
|
await ctx.persist();
|
|
13766
|
-
const delivered = handoff.channel === "clipboard" ?
|
|
13769
|
+
const delivered = handoff.channel === "clipboard" ? HANDOFF_OUTPUT.receipt_clipboard : HANDOFF_OUTPUT.receipt_file.replace("{file}", handoff.file ?? "");
|
|
13767
13770
|
const verified = uploaded.verification === "verified" ? delivered : `${delivered} The server has not finished verifying the file: for the next few seconds the recipient sees "not ready", after which the link works.`;
|
|
13768
13771
|
const receipt = ctx.ephemeral ? `${verified} This server keeps no state on disk: the handle lives until it restarts; the seal's expiry does not depend on it.` : verified;
|
|
13769
13772
|
return {
|
|
@@ -13965,7 +13968,7 @@ function proFileGetOutputToWire(out) {
|
|
|
13965
13968
|
}
|
|
13966
13969
|
|
|
13967
13970
|
// src/server.ts
|
|
13968
|
-
var SERVER_VERSION = "0.2.
|
|
13971
|
+
var SERVER_VERSION = "0.2.5";
|
|
13969
13972
|
var toolMeta = (name) => {
|
|
13970
13973
|
const { title, description, annotations } = seal_mcp_v1_default.tools[name];
|
|
13971
13974
|
return { title, description, annotations };
|
package/dist/cli.js
CHANGED
|
@@ -11343,13 +11343,13 @@ var seal_mcp_v1_default = {
|
|
|
11343
11343
|
progress: "When a `tools/call` carries `_meta.progressToken`, `seal_share` and `seal_open mode=file` send `notifications/progress` with `progress` = ciphertext bytes done (upload: confirmed by storage) and `total` = ciphertext bytes in all; at most one per second, `progress` strictly increasing, the last one at `progress = total`."
|
|
11344
11344
|
},
|
|
11345
11345
|
server_instructions: {
|
|
11346
|
-
text: "SEAL moves files and secrets between people and agents without their content entering this conversation. When someone wants a file, folder or secret sent to them, to another machine or to another agent, call seal_share with its path and do not open, print or Read it first. When you need an API key, password, file or folder from the user, or they offer or ask how to give you one, call seal_request right away instead of explaining other ways or asking them to paste or upload it. Open a SEAL link someone gave you with seal_open (mode=file for secrets and large files).",
|
|
11346
|
+
text: "SEAL moves files and secrets between people and agents without their content entering this conversation. When someone wants a file, folder or secret sent to them, to another machine or to another agent, call seal_share with its path and do not open, print or Read it first. When you need an API key, password, file or folder from the user, or they offer or ask how to give you one, call seal_request right away instead of explaining other ways or asking them to paste or upload it. Open a SEAL link someone gave you with seal_open (mode=file for secrets and large files). Never read or print a SEAL handoff file.",
|
|
11347
11347
|
note: "The `instructions` of the `initialize` result (SPEC-AGENTS \xA78.1). Hosts that defer MCP tools behind a tool search (Claude Code) show the model only tool names until it searches, but put these instructions into the system prompt: this is the one text a model reads before it decides to look for a tool, or reads the file it was asked to send."
|
|
11348
11348
|
},
|
|
11349
11349
|
tools: {
|
|
11350
11350
|
seal_share: {
|
|
11351
11351
|
title: "Share a file via SEAL",
|
|
11352
|
-
description: "Give the user or another agent a file or a secret WITHOUT it passing through this chat. Works for
|
|
11352
|
+
description: "Give the user or another agent a file or a secret WITHOUT it passing through this chat. Works for large files (folders, dumps, exports, builds, videos \u2014 up to 1 GB free, more after one card payment by the user). Default mode `handoff`: the link goes to the user's clipboard and you get a handle. Where there is no clipboard it goes to a 0600 file and you get its path: do not read that file and do not print it. Mode `forward`: a link only the holder of the given X25519 key can open \u2014 use it for another agent. Never paste secrets or huge content into the chat instead.",
|
|
11353
11353
|
annotations: { destructiveHint: false, openWorldHint: true },
|
|
11354
11354
|
input: {
|
|
11355
11355
|
properties: {
|
|
@@ -11399,7 +11399,9 @@ var seal_mcp_v1_default = {
|
|
|
11399
11399
|
expires_at: { type: "string", format: "date-time", description: "ISO 8601 UTC expiry timestamp." }
|
|
11400
11400
|
},
|
|
11401
11401
|
MUST_NOT_contain: ["share_url", "url", "password", "passphrase", "link_key", "owner_token"],
|
|
11402
|
-
rationale: "Anything in this object reaches the model. Any field that lets the model reconstruct or re-issue the share capability defeats handoff mode."
|
|
11402
|
+
rationale: "Anything in this object reaches the model. Any field that lets the model reconstruct or re-issue the share capability defeats handoff mode.",
|
|
11403
|
+
receipt_clipboard: "The seal link is on your clipboard. Paste it to the recipient.",
|
|
11404
|
+
receipt_file: "The seal link is in {file} (mode 0600, removed automatically later). Give it to the recipient. Anyone who can read files on this machine as this user, this agent included, can read it. In a cloud or container session prefer mode=forward to the recipient\u2019s key."
|
|
11403
11405
|
},
|
|
11404
11406
|
output_forward: {
|
|
11405
11407
|
type: "object",
|
|
@@ -13335,6 +13337,7 @@ function guessMimeFromName(name) {
|
|
|
13335
13337
|
}
|
|
13336
13338
|
var VALID_TTL = ["5m", "30m", "1h", "1d", "7d"];
|
|
13337
13339
|
var EXPIRE_DEFAULT = seal_mcp_v1_default.tools.seal_share.expire_default;
|
|
13340
|
+
var HANDOFF_OUTPUT = seal_mcp_v1_default.tools.seal_share.output_handoff;
|
|
13338
13341
|
var TIER_BYTES2 = limits_default2.limits.TIER_BYTES;
|
|
13339
13342
|
var PAYMENT_RECEIPT = "The file is larger than 1 GB. Show the user the payment link; the upload continues after payment. Then call seal_share with `payment` set to this handle.";
|
|
13340
13343
|
function defaultExpire(mode, size) {
|
|
@@ -13735,7 +13738,7 @@ async function deliver(ctx, deps, { mode, recipientPub, expireMs }, { handle, op
|
|
|
13735
13738
|
appendAudit(ctx, "seal_share", handle, mode);
|
|
13736
13739
|
delete ctx.state.pending[handle];
|
|
13737
13740
|
await ctx.persist();
|
|
13738
|
-
const delivered = handoff.channel === "clipboard" ?
|
|
13741
|
+
const delivered = handoff.channel === "clipboard" ? HANDOFF_OUTPUT.receipt_clipboard : HANDOFF_OUTPUT.receipt_file.replace("{file}", handoff.file ?? "");
|
|
13739
13742
|
const verified = uploaded.verification === "verified" ? delivered : `${delivered} The server has not finished verifying the file: for the next few seconds the recipient sees "not ready", after which the link works.`;
|
|
13740
13743
|
const receipt = ctx.ephemeral ? `${verified} This server keeps no state on disk: the handle lives until it restarts; the seal's expiry does not depend on it.` : verified;
|
|
13741
13744
|
return {
|
|
@@ -13937,7 +13940,7 @@ function proFileGetOutputToWire(out) {
|
|
|
13937
13940
|
}
|
|
13938
13941
|
|
|
13939
13942
|
// src/server.ts
|
|
13940
|
-
var SERVER_VERSION = "0.2.
|
|
13943
|
+
var SERVER_VERSION = "0.2.5";
|
|
13941
13944
|
var toolMeta = (name) => {
|
|
13942
13945
|
const { title, description, annotations } = seal_mcp_v1_default.tools[name];
|
|
13943
13946
|
return { title, description, annotations };
|
package/dist/index.cjs
CHANGED
|
@@ -4138,13 +4138,13 @@ var seal_mcp_v1_default = {
|
|
|
4138
4138
|
progress: "When a `tools/call` carries `_meta.progressToken`, `seal_share` and `seal_open mode=file` send `notifications/progress` with `progress` = ciphertext bytes done (upload: confirmed by storage) and `total` = ciphertext bytes in all; at most one per second, `progress` strictly increasing, the last one at `progress = total`."
|
|
4139
4139
|
},
|
|
4140
4140
|
server_instructions: {
|
|
4141
|
-
text: "SEAL moves files and secrets between people and agents without their content entering this conversation. When someone wants a file, folder or secret sent to them, to another machine or to another agent, call seal_share with its path and do not open, print or Read it first. When you need an API key, password, file or folder from the user, or they offer or ask how to give you one, call seal_request right away instead of explaining other ways or asking them to paste or upload it. Open a SEAL link someone gave you with seal_open (mode=file for secrets and large files).",
|
|
4141
|
+
text: "SEAL moves files and secrets between people and agents without their content entering this conversation. When someone wants a file, folder or secret sent to them, to another machine or to another agent, call seal_share with its path and do not open, print or Read it first. When you need an API key, password, file or folder from the user, or they offer or ask how to give you one, call seal_request right away instead of explaining other ways or asking them to paste or upload it. Open a SEAL link someone gave you with seal_open (mode=file for secrets and large files). Never read or print a SEAL handoff file.",
|
|
4142
4142
|
note: "The `instructions` of the `initialize` result (SPEC-AGENTS \xA78.1). Hosts that defer MCP tools behind a tool search (Claude Code) show the model only tool names until it searches, but put these instructions into the system prompt: this is the one text a model reads before it decides to look for a tool, or reads the file it was asked to send."
|
|
4143
4143
|
},
|
|
4144
4144
|
tools: {
|
|
4145
4145
|
seal_share: {
|
|
4146
4146
|
title: "Share a file via SEAL",
|
|
4147
|
-
description: "Give the user or another agent a file or a secret WITHOUT it passing through this chat. Works for
|
|
4147
|
+
description: "Give the user or another agent a file or a secret WITHOUT it passing through this chat. Works for large files (folders, dumps, exports, builds, videos \u2014 up to 1 GB free, more after one card payment by the user). Default mode `handoff`: the link goes to the user's clipboard and you get a handle. Where there is no clipboard it goes to a 0600 file and you get its path: do not read that file and do not print it. Mode `forward`: a link only the holder of the given X25519 key can open \u2014 use it for another agent. Never paste secrets or huge content into the chat instead.",
|
|
4148
4148
|
annotations: { destructiveHint: false, openWorldHint: true },
|
|
4149
4149
|
input: {
|
|
4150
4150
|
properties: {
|
|
@@ -4194,7 +4194,9 @@ var seal_mcp_v1_default = {
|
|
|
4194
4194
|
expires_at: { type: "string", format: "date-time", description: "ISO 8601 UTC expiry timestamp." }
|
|
4195
4195
|
},
|
|
4196
4196
|
MUST_NOT_contain: ["share_url", "url", "password", "passphrase", "link_key", "owner_token"],
|
|
4197
|
-
rationale: "Anything in this object reaches the model. Any field that lets the model reconstruct or re-issue the share capability defeats handoff mode."
|
|
4197
|
+
rationale: "Anything in this object reaches the model. Any field that lets the model reconstruct or re-issue the share capability defeats handoff mode.",
|
|
4198
|
+
receipt_clipboard: "The seal link is on your clipboard. Paste it to the recipient.",
|
|
4199
|
+
receipt_file: "The seal link is in {file} (mode 0600, removed automatically later). Give it to the recipient. Anyone who can read files on this machine as this user, this agent included, can read it. In a cloud or container session prefer mode=forward to the recipient\u2019s key."
|
|
4198
4200
|
},
|
|
4199
4201
|
output_forward: {
|
|
4200
4202
|
type: "object",
|
|
@@ -13190,6 +13192,7 @@ function guessMimeFromName(name) {
|
|
|
13190
13192
|
}
|
|
13191
13193
|
var VALID_TTL = ["5m", "30m", "1h", "1d", "7d"];
|
|
13192
13194
|
var EXPIRE_DEFAULT = seal_mcp_v1_default.tools.seal_share.expire_default;
|
|
13195
|
+
var HANDOFF_OUTPUT = seal_mcp_v1_default.tools.seal_share.output_handoff;
|
|
13193
13196
|
var TIER_BYTES2 = limits_default2.limits.TIER_BYTES;
|
|
13194
13197
|
var PAYMENT_RECEIPT = "The file is larger than 1 GB. Show the user the payment link; the upload continues after payment. Then call seal_share with `payment` set to this handle.";
|
|
13195
13198
|
function defaultExpire(mode, size) {
|
|
@@ -13590,7 +13593,7 @@ async function deliver(ctx, deps, { mode, recipientPub, expireMs }, { handle, op
|
|
|
13590
13593
|
appendAudit(ctx, "seal_share", handle, mode);
|
|
13591
13594
|
delete ctx.state.pending[handle];
|
|
13592
13595
|
await ctx.persist();
|
|
13593
|
-
const delivered = handoff.channel === "clipboard" ?
|
|
13596
|
+
const delivered = handoff.channel === "clipboard" ? HANDOFF_OUTPUT.receipt_clipboard : HANDOFF_OUTPUT.receipt_file.replace("{file}", handoff.file ?? "");
|
|
13594
13597
|
const verified = uploaded.verification === "verified" ? delivered : `${delivered} The server has not finished verifying the file: for the next few seconds the recipient sees "not ready", after which the link works.`;
|
|
13595
13598
|
const receipt = ctx.ephemeral ? `${verified} This server keeps no state on disk: the handle lives until it restarts; the seal's expiry does not depend on it.` : verified;
|
|
13596
13599
|
return {
|
|
@@ -13792,7 +13795,7 @@ function proFileGetOutputToWire(out) {
|
|
|
13792
13795
|
}
|
|
13793
13796
|
|
|
13794
13797
|
// src/server.ts
|
|
13795
|
-
var SERVER_VERSION = "0.2.
|
|
13798
|
+
var SERVER_VERSION = "0.2.5";
|
|
13796
13799
|
var toolMeta = (name) => {
|
|
13797
13800
|
const { title, description, annotations } = seal_mcp_v1_default.tools[name];
|
|
13798
13801
|
return { title, description, annotations };
|