relic-mcp 0.1.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/README.md +90 -0
- package/dist/relic-mcp.js +1088 -0
- package/package.json +47 -0
- package/src/files.ts +30 -0
- package/src/http.ts +192 -0
- package/src/index.ts +92 -0
- package/src/protocol.ts +148 -0
- package/src/publish.ts +370 -0
- package/src/server.ts +406 -0
package/README.md
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# relic-mcp
|
|
2
|
+
|
|
3
|
+
Publish a file as an encrypted relic and get back a shareable link. The
|
|
4
|
+
encryption key is generated on your machine and is never sent to the service.
|
|
5
|
+
|
|
6
|
+
```bash
|
|
7
|
+
claude mcp add relic \
|
|
8
|
+
--env RELIC_SERVICE_ORIGIN=https://your-relic-service \
|
|
9
|
+
-- npx -y relic-mcp
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Then: *"publish ./report.md as a relic."*
|
|
13
|
+
|
|
14
|
+
For any client that takes a JSON config:
|
|
15
|
+
|
|
16
|
+
```json
|
|
17
|
+
{
|
|
18
|
+
"mcpServers": {
|
|
19
|
+
"relic": {
|
|
20
|
+
"command": "npx",
|
|
21
|
+
"args": ["-y", "relic-mcp"],
|
|
22
|
+
"env": { "RELIC_SERVICE_ORIGIN": "https://your-relic-service" }
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## What it does with your file
|
|
29
|
+
|
|
30
|
+
1. Reads it from disk, in this process. It is never sent anywhere in plaintext.
|
|
31
|
+
2. Draws a 128-bit key and a 26-character relic id independently from your
|
|
32
|
+
machine's CSPRNG. Neither derives from the other.
|
|
33
|
+
3. Encrypts locally with AES-128-GCM under RFC 8188 `aes128gcm` framing.
|
|
34
|
+
4. Uploads **only ciphertext**, straight to object storage under a signed URL.
|
|
35
|
+
It does not pass through the Relic service.
|
|
36
|
+
5. Tells the service three things: a coarse renderer class from a seven-value
|
|
37
|
+
list, this client's name, and the ciphertext's byte length. Not your
|
|
38
|
+
filename, not the mimetype, not the contents.
|
|
39
|
+
|
|
40
|
+
Call the `relic_describe_client` tool and it will tell you all of this itself,
|
|
41
|
+
without reading a file or making a request.
|
|
42
|
+
|
|
43
|
+
## What it does not protect against
|
|
44
|
+
|
|
45
|
+
The tool returns the full URL, and the key lives in that URL's fragment,
|
|
46
|
+
because handing you a usable link is the point. **So the key enters your
|
|
47
|
+
model's context and your session transcript on every publish.** Zero-knowledge
|
|
48
|
+
holds against the Relic operator. It does not hold against your model provider
|
|
49
|
+
or whoever stores your transcripts. That is structural, not a defect awaiting
|
|
50
|
+
a fix.
|
|
51
|
+
|
|
52
|
+
## Why it runs locally
|
|
53
|
+
|
|
54
|
+
Encryption has to happen where the plaintext is, so a hosted version of this
|
|
55
|
+
would have to receive your file, which defeats the point. Nothing here is
|
|
56
|
+
fetched from the network and executed.
|
|
57
|
+
|
|
58
|
+
Because a local client is otherwise opaque, it ships as **readable source
|
|
59
|
+
rather than a compiled binary**. `dist/relic-mcp.js` is a single unminified
|
|
60
|
+
file and it is exactly what runs; the TypeScript it was built from is in the
|
|
61
|
+
same package. Releases carry npm provenance, a cryptographic attestation
|
|
62
|
+
binding the tarball to a specific commit and workflow.
|
|
63
|
+
|
|
64
|
+
## Tools
|
|
65
|
+
|
|
66
|
+
| Tool | Input | Notes |
|
|
67
|
+
|---|---|---|
|
|
68
|
+
| `relic_publish` | `path`, optional `filename` | A filesystem path. Inline content is deliberately not accepted, so the plaintext never joins the key in your transcript. |
|
|
69
|
+
| `relic_describe_client` | none | Explains the encryption path. Reads nothing, sends nothing. |
|
|
70
|
+
|
|
71
|
+
## Environment
|
|
72
|
+
|
|
73
|
+
| Variable | Meaning |
|
|
74
|
+
|---|---|
|
|
75
|
+
| `RELIC_SERVICE_ORIGIN` | The Relic service to publish to. |
|
|
76
|
+
| `RELIC_ORIGIN` | Origin used to build the shareable URL. Defaults to the above. |
|
|
77
|
+
| `RELIC_CLIENT_NAME` | Reported to the service as the publishing client. |
|
|
78
|
+
| `RELIC_MCP_HTTP` | `1` to serve Streamable HTTP instead of stdio. |
|
|
79
|
+
| `RELIC_MCP_PORT`, `RELIC_MCP_HOST` | HTTP bind. Defaults to `127.0.0.1:7333`. |
|
|
80
|
+
| `RELIC_MCP_ALLOWED_ORIGINS` | Comma-separated `Origin` allowlist for HTTP. |
|
|
81
|
+
|
|
82
|
+
## Protocol
|
|
83
|
+
|
|
84
|
+
MCP revision `2026-07-28`, the stateless one: no handshake, no session, no
|
|
85
|
+
`Mcp-Session-Id`. Nothing is retained between calls. The handshake-based
|
|
86
|
+
revisions (`2025-11-25` and earlier) are still answered.
|
|
87
|
+
|
|
88
|
+
Requires Node 18 or newer.
|
|
89
|
+
|
|
90
|
+
MIT licensed. Source: https://github.com/TheBushidoCollective/artifacts
|