relic-mcp 0.3.2 → 0.3.3
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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/dist/relic-mcp.js +9 -6
- package/package.json +1 -1
- package/skills/relic/SKILL.md +5 -0
- package/src/server.ts +15 -7
|
@@ -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.
|
|
13
|
+
"version": "0.3.3",
|
|
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.
|
|
24
|
+
"version": "0.3.3"
|
|
25
25
|
}
|
|
26
26
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "relic",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.3",
|
|
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
|
@@ -1163,10 +1163,11 @@ var DESCRIBE_TOOL_NAME = "relic_describe_client";
|
|
|
1163
1163
|
var REPUBLISH_TOOL_NAME = "relic_republish";
|
|
1164
1164
|
var LOOKUP_TOOL_NAME = "relic_lookup_source";
|
|
1165
1165
|
var MAX_TTL_DAYS = 3650;
|
|
1166
|
+
var VERSION_HISTORY_DISCLOSURE = "Anyone holding a relic's link can fetch every version it has ever held, " + "so republishing does not withdraw earlier content.";
|
|
1166
1167
|
var TOOL_DEFINITION = {
|
|
1167
1168
|
name: TOOL_NAME,
|
|
1168
1169
|
title: "Publish a relic",
|
|
1169
|
-
description: "Encrypt a file on this machine and publish it as a new relic, returning " + "a shareable URL. Publishing an update this way costs a second URL that " + "nobody holding the first one will ever see; use relic_republish instead " + "so the existing URL keeps working. The encryption key is generated
|
|
1170
|
+
description: "Encrypt a file on this machine and publish it as a new relic, returning " + "a shareable URL. Publishing an update this way costs a second URL that " + "nobody holding the first one will ever see; use relic_republish instead " + "so the existing URL keeps working. " + VERSION_HISTORY_DISCLOSURE + " The encryption key is generated locally and never sent to the service. " + "Takes a filesystem path, never " + "inline content.",
|
|
1170
1171
|
inputSchema: {
|
|
1171
1172
|
type: "object",
|
|
1172
1173
|
properties: {
|
|
@@ -1227,7 +1228,7 @@ var TOOL_DEFINITION = {
|
|
|
1227
1228
|
var REPUBLISH_TOOL_DEFINITION = {
|
|
1228
1229
|
name: REPUBLISH_TOOL_NAME,
|
|
1229
1230
|
title: "Republish a relic",
|
|
1230
|
-
description: "Publish a new version of a relic this machine originally published, " + "encrypting under the same key so the existing share URL keeps working. " + "Only possible from the machine that holds the relic's key and publish " + "token; a relic that was taken down can never be revived.",
|
|
1231
|
+
description: "Publish a new version of a relic this machine originally published, " + "encrypting under the same key so the existing share URL keeps working. " + VERSION_HISTORY_DISCLOSURE + " Only possible from the machine that holds the relic's key and publish " + "token; a relic that was taken down can never be revived.",
|
|
1231
1232
|
inputSchema: {
|
|
1232
1233
|
type: "object",
|
|
1233
1234
|
properties: {
|
|
@@ -1346,7 +1347,7 @@ var DESCRIBE_TOOL_DEFINITION = {
|
|
|
1346
1347
|
additionalProperties: false
|
|
1347
1348
|
}
|
|
1348
1349
|
};
|
|
1349
|
-
var SERVER_VERSION = "0.3.
|
|
1350
|
+
var SERVER_VERSION = "0.3.3";
|
|
1350
1351
|
var SERVER_INFO = {
|
|
1351
1352
|
name: "relic",
|
|
1352
1353
|
title: "Relic",
|
|
@@ -1359,7 +1360,7 @@ Five things that change how you should act:
|
|
|
1359
1360
|
|
|
1360
1361
|
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.
|
|
1361
1362
|
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.
|
|
1362
|
-
3.
|
|
1363
|
+
3. Check existing sources with relic_lookup_source. Use relic_republish when found; relic_publish otherwise costs a second URL. ${VERSION_HISTORY_DISCLOSURE}
|
|
1363
1364
|
4. 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.
|
|
1364
1365
|
5. 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.`;
|
|
1365
1366
|
async function handleMessage(message, deps) {
|
|
@@ -1486,7 +1487,8 @@ async function callTool(id2, params, deps) {
|
|
|
1486
1487
|
|
|
1487
1488
|
` + (result.relic_expires_at === null ? "It does not expire; it is kept until it is deleted. " : `Expires ${result.relic_expires_at}. `) + "Anyone with this link, " + "including its fragment, can read the file. The key is in the " + "fragment and it is now in this transcript. This machine can " + `republish it later; the link will not change.
|
|
1488
1489
|
` + isolationNote(result.renderer_class) + `What Relic knows: ${result.disclosure_url}`
|
|
1489
|
-
}
|
|
1490
|
+
},
|
|
1491
|
+
{ type: "text", text: VERSION_HISTORY_DISCLOSURE }
|
|
1490
1492
|
],
|
|
1491
1493
|
structuredContent: result,
|
|
1492
1494
|
isError: false
|
|
@@ -1564,7 +1566,8 @@ async function callRepublish(id2, params, deps) {
|
|
|
1564
1566
|
|
|
1565
1567
|
` + (result.relic_expires_at === null ? "The relic does not expire; it is kept until it is deleted." : `Expires ${result.relic_expires_at}.`) + `
|
|
1566
1568
|
` + `What Relic knows: ${result.disclosure_url}`
|
|
1567
|
-
}
|
|
1569
|
+
},
|
|
1570
|
+
{ type: "text", text: VERSION_HISTORY_DISCLOSURE }
|
|
1568
1571
|
],
|
|
1569
1572
|
structuredContent: result,
|
|
1570
1573
|
isError: false
|
package/package.json
CHANGED
package/skills/relic/SKILL.md
CHANGED
|
@@ -39,6 +39,11 @@ Do not publish an update as a new relic. That costs a second URL that nobody
|
|
|
39
39
|
holding the first one will ever see. `relic_publish` enforces this: when local
|
|
40
40
|
state matches the source, it refuses and points to `relic_republish`.
|
|
41
41
|
|
|
42
|
+
Anyone holding a relic's link can fetch every version it has ever held, so
|
|
43
|
+
republishing does not withdraw earlier content. Republishing moves the artifact
|
|
44
|
+
forward without retracting what came before. Deleting the relic still removes
|
|
45
|
+
every version.
|
|
46
|
+
|
|
42
47
|
Optional arguments worth knowing:
|
|
43
48
|
|
|
44
49
|
- `filename` overrides the display name shown to the recipient.
|
package/src/server.ts
CHANGED
|
@@ -105,6 +105,10 @@ export const LOOKUP_TOOL_NAME = 'relic_lookup_source';
|
|
|
105
105
|
*/
|
|
106
106
|
const MAX_TTL_DAYS = 3650;
|
|
107
107
|
|
|
108
|
+
const VERSION_HISTORY_DISCLOSURE =
|
|
109
|
+
"Anyone holding a relic's link can fetch every version it has ever held, " +
|
|
110
|
+
'so republishing does not withdraw earlier content.';
|
|
111
|
+
|
|
108
112
|
export const TOOL_DEFINITION = {
|
|
109
113
|
name: TOOL_NAME,
|
|
110
114
|
title: 'Publish a relic',
|
|
@@ -112,8 +116,10 @@ export const TOOL_DEFINITION = {
|
|
|
112
116
|
'Encrypt a file on this machine and publish it as a new relic, returning ' +
|
|
113
117
|
'a shareable URL. Publishing an update this way costs a second URL that ' +
|
|
114
118
|
'nobody holding the first one will ever see; use relic_republish instead ' +
|
|
115
|
-
'so the existing URL keeps working.
|
|
116
|
-
|
|
119
|
+
'so the existing URL keeps working. ' +
|
|
120
|
+
VERSION_HISTORY_DISCLOSURE +
|
|
121
|
+
' The encryption key is generated locally and never sent to the service. ' +
|
|
122
|
+
'Takes a filesystem path, never ' +
|
|
117
123
|
'inline content.',
|
|
118
124
|
inputSchema: {
|
|
119
125
|
type: 'object',
|
|
@@ -187,7 +193,8 @@ export const REPUBLISH_TOOL_DEFINITION = {
|
|
|
187
193
|
description:
|
|
188
194
|
'Publish a new version of a relic this machine originally published, ' +
|
|
189
195
|
'encrypting under the same key so the existing share URL keeps working. ' +
|
|
190
|
-
|
|
196
|
+
VERSION_HISTORY_DISCLOSURE +
|
|
197
|
+
" Only possible from the machine that holds the relic's key and publish " +
|
|
191
198
|
'token; a relic that was taken down can never be revived.',
|
|
192
199
|
inputSchema: {
|
|
193
200
|
type: 'object',
|
|
@@ -369,10 +376,9 @@ Five things that change how you should act:
|
|
|
369
376
|
the file. Do not paste it into a tracker, a log, or a public channel.
|
|
370
377
|
2. Publishing puts the key in this transcript. That is structural rather than \
|
|
371
378
|
a defect, and worth saying plainly when you hand the link over.
|
|
372
|
-
3.
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
recovers the id, and force_new is only for a deliberate second link.
|
|
379
|
+
3. Check existing sources with relic_lookup_source. Use relic_republish when \
|
|
380
|
+
found; relic_publish otherwise costs a second URL. \
|
|
381
|
+
${VERSION_HISTORY_DISCLOSURE}
|
|
376
382
|
4. A relic can be republished only from the machine that published it, which \
|
|
377
383
|
is where its key and publish token are stored. Anywhere else it refuses, and \
|
|
378
384
|
no retry changes that.
|
|
@@ -601,6 +607,7 @@ async function callTool(
|
|
|
601
607
|
isolationNote(result.renderer_class) +
|
|
602
608
|
`What Relic knows: ${result.disclosure_url}`,
|
|
603
609
|
},
|
|
610
|
+
{ type: 'text', text: VERSION_HISTORY_DISCLOSURE },
|
|
604
611
|
],
|
|
605
612
|
structuredContent: result,
|
|
606
613
|
isError: false,
|
|
@@ -732,6 +739,7 @@ async function callRepublish(
|
|
|
732
739
|
'\n' +
|
|
733
740
|
`What Relic knows: ${result.disclosure_url}`,
|
|
734
741
|
},
|
|
742
|
+
{ type: 'text', text: VERSION_HISTORY_DISCLOSURE },
|
|
735
743
|
],
|
|
736
744
|
structuredContent: result,
|
|
737
745
|
isError: false,
|