relic-mcp 0.3.0 → 0.3.1

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.
@@ -10,7 +10,7 @@
10
10
  {
11
11
  "name": "relic",
12
12
  "description": "Publish a file from your machine as an encrypted, shareable link. The agent encrypts locally, uploads only ciphertext, and hands back a URL whose fragment holds the key, so the service stores something it cannot read.",
13
- "version": "0.3.0",
13
+ "version": "0.3.1",
14
14
  "source": "./",
15
15
  "author": {
16
16
  "name": "The Bushido Collective",
@@ -21,6 +21,6 @@
21
21
  }
22
22
  ],
23
23
  "metadata": {
24
- "version": "0.3.0"
24
+ "version": "0.3.1"
25
25
  }
26
26
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "relic",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "Publish a file from your machine as an encrypted, shareable link. The agent encrypts locally, uploads only ciphertext, and hands back a URL whose fragment holds the key, so the service stores something it cannot read.",
5
5
  "mcpServers": "./mcp-servers.json",
6
6
  "author": {
package/dist/relic-mcp.js CHANGED
@@ -1093,13 +1093,21 @@ var DESCRIBE_TOOL_DEFINITION = {
1093
1093
  additionalProperties: false
1094
1094
  }
1095
1095
  };
1096
- var SERVER_VERSION = "0.3.0";
1096
+ var SERVER_VERSION = "0.3.1";
1097
1097
  var SERVER_INFO = {
1098
1098
  name: "relic",
1099
1099
  title: "Relic",
1100
1100
  version: SERVER_VERSION
1101
1101
  };
1102
1102
  var CAPABILITIES = { tools: {} };
1103
+ var INSTRUCTIONS = `Relic turns a file on this machine into an encrypted link. Encryption happens locally, only ciphertext is uploaded, and the key lives in the URL fragment, which browsers never send to a server.
1104
+
1105
+ Four things that change how you should act:
1106
+
1107
+ 1. The link is the credential. Anyone holding it, fragment included, can read the file. Do not paste it into a tracker, a log, or a public channel.
1108
+ 2. Publishing puts the key in this transcript. That is structural rather than a defect, and worth saying plainly when you hand the link over.
1109
+ 3. A relic can be republished only from the machine that published it, which is where its key and publish token are stored. Anywhere else it refuses, and no retry changes that.
1110
+ 4. Rendered HTML and JSX run in an isolated frame with no network access. Inline the styles, scripts, fonts, and images a page needs, because a CDN reference renders as nothing. Decide that before you write the file.`;
1103
1111
  async function handleMessage(message, deps) {
1104
1112
  if (message.id === undefined)
1105
1113
  return;
@@ -1117,7 +1125,8 @@ async function handleMessage(message, deps) {
1117
1125
  result: {
1118
1126
  protocolVersions: [...SUPPORTED_PROTOCOL_VERSIONS],
1119
1127
  capabilities: CAPABILITIES,
1120
- serverInfo: SERVER_INFO
1128
+ serverInfo: SERVER_INFO,
1129
+ instructions: INSTRUCTIONS
1121
1130
  }
1122
1131
  };
1123
1132
  case "initialize": {
@@ -1128,7 +1137,8 @@ async function handleMessage(message, deps) {
1128
1137
  result: {
1129
1138
  protocolVersion: isSupportedVersion(asked) ? asked : PROTOCOL_VERSION,
1130
1139
  capabilities: CAPABILITIES,
1131
- serverInfo: SERVER_INFO
1140
+ serverInfo: SERVER_INFO,
1141
+ instructions: INSTRUCTIONS
1132
1142
  }
1133
1143
  };
1134
1144
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "relic-mcp",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "Publish a file as an encrypted relic. The key is generated on your machine and never sent to the service.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -85,9 +85,15 @@ Also worth one line, unprompted, the first time in a session:
85
85
  ## What the recipient gets
86
86
 
87
87
  A page that fetches the ciphertext, decrypts it in their browser, and renders
88
- by type. Markdown, code, images, and plain text render inline. HTML renders in
89
- a sandboxed frame on a separate origin, so a published page cannot reach the
90
- key or the service. Anything else offers a download.
88
+ by type. Markdown, code, images, and plain text render inline. HTML and JSX
89
+ render in a sandboxed frame on a separate origin, so a published page cannot
90
+ reach the key or the service. Anything else offers a download.
91
+
92
+ That frame has **no network access**: its policy permits no remote source at
93
+ all, so a page cannot fetch, beacon, or load an external image, font, or
94
+ script. Inline what a page needs when you generate it, because a CDN
95
+ reference renders as nothing. The upside is that a relic cannot phone home or
96
+ learn the recipient's IP address.
91
97
 
92
98
  They need the whole URL including the `#...` part. A link truncated at the `#`
93
99
  is a page that cannot decrypt anything, and that is the most common way sharing
package/src/server.ts CHANGED
@@ -262,6 +262,40 @@ export const SERVER_INFO = {
262
262
 
263
263
  export const CAPABILITIES = { tools: {} } as const;
264
264
 
265
+ /**
266
+ * Server-level guidance, returned on the handshake so a client can put it in
267
+ * the model's context before any tool is called.
268
+ *
269
+ * The plugin ships a skill with the same facts, but a skill only reaches
270
+ * Claude Code, and only when somebody installs the plugin rather than wiring
271
+ * this server directly. Every other client saw tool descriptions and nothing
272
+ * else, which left four things an agent cannot read off a schema.
273
+ *
274
+ * Item four is the reason this exists at all rather than living only in the
275
+ * publish result. The result is returned after the file is written, which is
276
+ * too late for an agent that already linked a stylesheet from a CDN. This
277
+ * lands before generation, which is the only moment the advice can be taken.
278
+ *
279
+ * It costs context on every session, so it stays short and it stays true.
280
+ * Anything that needs a paragraph belongs in the skill or the disclosure.
281
+ */
282
+ export const INSTRUCTIONS = `Relic turns a file on this machine into an \
283
+ encrypted link. Encryption happens locally, only ciphertext is uploaded, and \
284
+ the key lives in the URL fragment, which browsers never send to a server.
285
+
286
+ Four things that change how you should act:
287
+
288
+ 1. The link is the credential. Anyone holding it, fragment included, can read \
289
+ the file. Do not paste it into a tracker, a log, or a public channel.
290
+ 2. Publishing puts the key in this transcript. That is structural rather than \
291
+ a defect, and worth saying plainly when you hand the link over.
292
+ 3. A relic can be republished only from the machine that published it, which \
293
+ is where its key and publish token are stored. Anywhere else it refuses, and \
294
+ no retry changes that.
295
+ 4. Rendered HTML and JSX run in an isolated frame with no network access. \
296
+ Inline the styles, scripts, fonts, and images a page needs, because a CDN \
297
+ reference renders as nothing. Decide that before you write the file.`;
298
+
265
299
  /**
266
300
  * Handle one JSON-RPC message.
267
301
  *
@@ -297,6 +331,7 @@ export async function handleMessage(
297
331
  protocolVersions: [...SUPPORTED_PROTOCOL_VERSIONS],
298
332
  capabilities: CAPABILITIES,
299
333
  serverInfo: SERVER_INFO,
334
+ instructions: INSTRUCTIONS,
300
335
  },
301
336
  };
302
337
 
@@ -312,6 +347,7 @@ export async function handleMessage(
312
347
  protocolVersion: isSupportedVersion(asked) ? asked : PROTOCOL_VERSION,
313
348
  capabilities: CAPABILITIES,
314
349
  serverInfo: SERVER_INFO,
350
+ instructions: INSTRUCTIONS,
315
351
  },
316
352
  };
317
353
  }