relic-mcp 0.3.3 → 0.5.0
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/README.md +42 -0
- package/dist/relic-mcp.js +527 -12
- package/package.json +1 -1
- package/skills/relic/SKILL.md +45 -1
- package/src/comments.ts +302 -0
- package/src/publish.ts +59 -8
- package/src/server.ts +363 -10
|
@@ -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.
|
|
13
|
+
"version": "0.5.0",
|
|
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.
|
|
24
|
+
"version": "0.5.0"
|
|
25
25
|
}
|
|
26
26
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "relic",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
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/README.md
CHANGED
|
@@ -96,6 +96,45 @@ created `0600` inside a `0700` directory, and redirectable with
|
|
|
96
96
|
longer matches the service's, and the relic cannot be republished from
|
|
97
97
|
this machine, though it can still be read.
|
|
98
98
|
|
|
99
|
+
## Comments
|
|
100
|
+
|
|
101
|
+
People can comment on a relic, and comments are the only channel back: there
|
|
102
|
+
is no reply-to and no dashboard. `relic_read_comments` reads them, oldest
|
|
103
|
+
first, decrypting on this machine.
|
|
104
|
+
|
|
105
|
+
```json
|
|
106
|
+
{
|
|
107
|
+
"name": "relic_read_comments",
|
|
108
|
+
"arguments": { "relic_id": "0a2c..." }
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
`relic_comment` writes one, encrypted here before it leaves:
|
|
113
|
+
|
|
114
|
+
```json
|
|
115
|
+
{
|
|
116
|
+
"name": "relic_comment",
|
|
117
|
+
"arguments": { "relic_id": "0a2c...", "body": "Fixed the chart." }
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Both take the relic id and refuse a share URL, because the URL carries the key
|
|
122
|
+
in its fragment and passing it would put the key in your transcript again for
|
|
123
|
+
nothing. Both work only on the machine that published the relic: the comment
|
|
124
|
+
key is derived from that relic's key with a distinct HKDF label, and the key
|
|
125
|
+
lives in the same local state file as the publish token.
|
|
126
|
+
|
|
127
|
+
A human commenter verifies an email address through a magic link, and that
|
|
128
|
+
address is their identity. This client has no mailbox, so its comments are
|
|
129
|
+
authorized by the publish token and attributed as `publisher`; an optional
|
|
130
|
+
`display_name` labels them and never replaces the attribution. A comment that
|
|
131
|
+
does not decrypt is returned marked unreadable with a count, never dropped,
|
|
132
|
+
because a quietly shortened list reads as agreement.
|
|
133
|
+
|
|
134
|
+
What the service holds is comment ciphertext it cannot read. What it learns is
|
|
135
|
+
who commented on which relic and when, which for a human commenter is a
|
|
136
|
+
verified email address. The content stays private; the participation does not.
|
|
137
|
+
|
|
99
138
|
## Why it runs locally
|
|
100
139
|
|
|
101
140
|
Encryption has to happen where the plaintext is, so a hosted version of this
|
|
@@ -113,7 +152,10 @@ binding the tarball to a specific commit and workflow.
|
|
|
113
152
|
| Tool | Input | Notes |
|
|
114
153
|
|---|---|---|
|
|
115
154
|
| `relic_publish` | `path`, optional `filename`, `ttl_days` | A filesystem path. Inline content is deliberately not accepted, so the plaintext never joins the key in your transcript. A relic is kept until it is deleted; `ttl_days` (an integer, 1 to 3650) gives it a lifetime. Reports the relic as version 1. |
|
|
155
|
+
| `relic_lookup_source` | `path` | Reads local state to find whether this machine already published that file, and returns the exact `relic_republish` call. Calls no server. |
|
|
116
156
|
| `relic_republish` | `relic_id`, `path`, optional `filename`, `ttl_days` | Publishes a new version under the same key, so the share URL is unchanged. Works only on the machine holding that relic's key and publish token; a taken-down relic can never be revived. |
|
|
157
|
+
| `relic_read_comments` | `relic_id` | Returns the relic's comments oldest first, decrypted locally, with the author and a count of any that would not decrypt. Works only on the machine that published. |
|
|
158
|
+
| `relic_comment` | `relic_id`, `body`, optional `display_name` | Leaves a comment, encrypted on this machine, authorized by the publish token and attributed as `publisher`. Body caps at 4096 bytes of UTF-8. |
|
|
117
159
|
| `relic_describe_client` | none | Explains the encryption path. Reads nothing, sends nothing. |
|
|
118
160
|
|
|
119
161
|
## Environment
|