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 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 model cannot exfiltrate the link because it never sees it.
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 any size (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 or a 0600 file and you get only a handle. 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.",
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" ? "The seal link is on your clipboard. Paste it to the recipient." : `The seal link is in ${handoff.file} (mode 0600, removed automatically later). Give it to the recipient.`;
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.4";
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 any size (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 or a 0600 file and you get only a handle. 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.",
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" ? "The seal link is on your clipboard. Paste it to the recipient." : `The seal link is in ${handoff.file} (mode 0600, removed automatically later). Give it to the recipient.`;
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.4";
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 any size (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 or a 0600 file and you get only a handle. 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.",
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" ? "The seal link is on your clipboard. Paste it to the recipient." : `The seal link is in ${handoff.file} (mode 0600, removed automatically later). Give it to the recipient.`;
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.4";
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 };