@sirrlock/mcp 0.1.0 → 1.0.2
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/LICENSE +21 -0
- package/README.md +100 -27
- package/dist/helpers.d.ts +8 -0
- package/dist/helpers.js +34 -0
- package/dist/helpers.js.map +1 -1
- package/dist/helpers.test.js +68 -0
- package/dist/helpers.test.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +621 -87
- package/dist/index.js.map +1 -1
- package/dist/index.test.d.ts +8 -0
- package/dist/index.test.js +619 -0
- package/dist/index.test.js.map +1 -0
- package/dist/integration.test.js +123 -0
- package/dist/integration.test.js.map +1 -1
- package/package.json +5 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024–2026 Sirr contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,26 +1,37 @@
|
|
|
1
1
|
# @sirrlock/mcp — Sirr MCP Server
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/@sirrlock/mcp)
|
|
4
|
+
[](https://www.npmjs.com/package/@sirrlock/mcp)
|
|
5
|
+
[](https://github.com/sirrlock/mcp/actions)
|
|
6
|
+
[](https://www.typescriptlang.org/)
|
|
7
|
+
[](https://nodejs.org)
|
|
8
|
+
[](https://github.com/sirrlock/mcp/blob/main/LICENSE)
|
|
9
|
+
[](https://github.com/sirrlock/mcp)
|
|
10
|
+
[](https://github.com/sirrlock/mcp)
|
|
11
|
+
|
|
3
12
|
Gives AI assistants like Claude direct access to your [Sirr](https://sirr.dev) secret vault. Push, read, and manage ephemeral secrets without leaving a conversation.
|
|
4
13
|
|
|
5
14
|
## Demo
|
|
6
15
|
|
|
7
|
-
|
|
16
|
+
### Public dead drop — push and burn
|
|
17
|
+
|
|
18
|
+
**Session 1 — push a secret (value-only, no key needed)**
|
|
8
19
|
|
|
9
20
|
```
|
|
10
|
-
❯
|
|
21
|
+
❯ stash this deploy token: 123asdzxc
|
|
11
22
|
|
|
12
|
-
⏺ sirr-mcp - push_secret (MCP)(
|
|
13
|
-
⎿ Stored
|
|
23
|
+
⏺ sirr-mcp - push_secret (MCP)(value: "123asdzxc", max_reads: 1)
|
|
24
|
+
⎿ Stored. ID: a1b2c3d4e5f6… URL: https://sirr.example/secrets/a1b2c3d4e5f6…
|
|
14
25
|
|
|
15
|
-
⏺ Stored.
|
|
26
|
+
⏺ Stored. Share the URL — it burns after one read.
|
|
16
27
|
```
|
|
17
28
|
|
|
18
|
-
**Session 2 —
|
|
29
|
+
**Session 2 — retrieve by ID (the vault burns it)**
|
|
19
30
|
|
|
20
31
|
```
|
|
21
|
-
❯
|
|
32
|
+
❯ get the secret at a1b2c3d4e5f6…
|
|
22
33
|
|
|
23
|
-
⏺ sirr-mcp - get_secret (MCP)(
|
|
34
|
+
⏺ sirr-mcp - get_secret (MCP)(id: "a1b2c3d4e5f6…")
|
|
24
35
|
⎿ 123asdzxc
|
|
25
36
|
|
|
26
37
|
⏺ Got it. Deploying to staging with the token. Done.
|
|
@@ -29,15 +40,29 @@ Gives AI assistants like Claude direct access to your [Sirr](https://sirr.dev) s
|
|
|
29
40
|
**Session 3 — secret is already gone**
|
|
30
41
|
|
|
31
42
|
```
|
|
32
|
-
❯
|
|
43
|
+
❯ get that secret again
|
|
33
44
|
|
|
34
|
-
⏺ sirr-mcp - get_secret (MCP)(
|
|
35
|
-
⎿ Secret
|
|
45
|
+
⏺ sirr-mcp - get_secret (MCP)(id: "a1b2c3d4e5f6…")
|
|
46
|
+
⎿ Secret not found, expired, or already burned.
|
|
36
47
|
|
|
37
48
|
⏺ The secret no longer exists on the server.
|
|
38
49
|
```
|
|
39
50
|
|
|
40
|
-
|
|
51
|
+
### Org-scoped named secret — set and get by key
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
❯ set the BITBUCKET_TOKEN to 123asdzxc in acme org
|
|
55
|
+
|
|
56
|
+
⏺ sirr-mcp - set_secret (MCP)(org: "acme", key: "BITBUCKET_TOKEN", value: "123asdzxc")
|
|
57
|
+
⎿ Stored 'BITBUCKET_TOKEN' in org acme.
|
|
58
|
+
|
|
59
|
+
❯ deploy to staging using sirr:BITBUCKET_TOKEN
|
|
60
|
+
|
|
61
|
+
⏺ sirr-mcp - get_secret (MCP)(key: "BITBUCKET_TOKEN", org: "acme")
|
|
62
|
+
⎿ 123asdzxc
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
The secret existed just long enough to be used. The vault enforces expiry server-side. Claude is instructed by the tool description not to memorize or repeat the value. Even if a different agent, session, or attacker asks — there is nothing left to return.
|
|
41
66
|
|
|
42
67
|
## Install
|
|
43
68
|
|
|
@@ -50,7 +75,7 @@ Or use `npx` without a global install — see the configuration block below.
|
|
|
50
75
|
## Quick start
|
|
51
76
|
|
|
52
77
|
1. **Start Sirr** — run the Sirr server and note the `SIRR_MASTER_KEY` you set (or the one it printed on first launch).
|
|
53
|
-
2. **Set your token** — `SIRR_TOKEN` in your MCP config must equal that `SIRR_MASTER_KEY` value
|
|
78
|
+
2. **Set your token** — `SIRR_TOKEN` in your MCP config must equal that `SIRR_MASTER_KEY` value (or a principal key for org-scoped access).
|
|
54
79
|
3. **Add to `.mcp.json`** — paste the config block below, substituting your server URL and key.
|
|
55
80
|
4. **Verify** — run `sirr-mcp --health` to confirm the connection before starting your AI session.
|
|
56
81
|
|
|
@@ -89,14 +114,15 @@ Using `npx` without a global install:
|
|
|
89
114
|
}
|
|
90
115
|
```
|
|
91
116
|
|
|
92
|
-
> **What is `SIRR_TOKEN`?**
|
|
117
|
+
> **What is `SIRR_TOKEN`?** For single-tenant usage, set it to `SIRR_MASTER_KEY` (full access). For multi-tenant org-scoped usage, set it to a principal key. A mismatch is the most common cause of 401 errors. See [sirr.dev/errors#401](https://sirr.dev/errors#401).
|
|
93
118
|
|
|
94
119
|
### Environment variables
|
|
95
120
|
|
|
96
121
|
| Variable | Default | Description |
|
|
97
122
|
|---|---|---|
|
|
98
123
|
| `SIRR_SERVER` | `http://localhost:39999` | Sirr server URL |
|
|
99
|
-
| `SIRR_TOKEN` | — | Bearer token —
|
|
124
|
+
| `SIRR_TOKEN` | — | Bearer token — `SIRR_MASTER_KEY` for full access, or a principal key for org-scoped access |
|
|
125
|
+
| `SIRR_ORG` | — | Organization ID for multi-tenant mode. When set, all secret/audit/webhook/prune paths are prefixed with `/orgs/{id}/`. Leave unset for single-tenant usage. |
|
|
100
126
|
|
|
101
127
|
## CLI flags
|
|
102
128
|
|
|
@@ -116,8 +142,11 @@ SIRR_SERVER=http://localhost:39999 SIRR_TOKEN=mykey sirr-mcp --health
|
|
|
116
142
|
|
|
117
143
|
| Tool | Description |
|
|
118
144
|
|---|---|
|
|
119
|
-
| `
|
|
120
|
-
| `
|
|
145
|
+
| `push_secret(value, ttl_seconds?, max_reads?)` | Anonymous public dead drop — value-only, returns `{id, url}`. No key or org needed. |
|
|
146
|
+
| `set_secret(org, key, value)` | Org-scoped named secret — returns `{key, id}`. 409 Conflict if key already exists; use `patch_secret` to update. |
|
|
147
|
+
| `get_secret(id)` or `get_secret(key, org)` | Dual mode: `id` fetches public dead drop (`GET /secrets/{id}`); `key`+`org` fetches org-scoped (`GET /orgs/{org}/secrets/{key}`) |
|
|
148
|
+
| `check_secret(key)` | Check if a secret exists and inspect its metadata — **without consuming a read** |
|
|
149
|
+
| `patch_secret(key, value?, ttl_seconds?, max_reads?)` | Update an existing secret's value, TTL, or read limit |
|
|
121
150
|
| `list_secrets()` | List all active secrets — metadata only, values never returned |
|
|
122
151
|
| `delete_secret(key)` | Burn a secret immediately, regardless of TTL or read count |
|
|
123
152
|
| `prune_secrets()` | Delete all expired secrets in one sweep |
|
|
@@ -127,7 +156,7 @@ SIRR_SERVER=http://localhost:39999 SIRR_TOKEN=mykey sirr-mcp --health
|
|
|
127
156
|
|
|
128
157
|
| Tool | Description |
|
|
129
158
|
|---|---|
|
|
130
|
-
| `sirr_audit(since?, action?, limit?)` | Query the audit log — secret creates, reads, deletes, and key events |
|
|
159
|
+
| `sirr_audit(since?, until?, action?, limit?)` | Query the audit log — secret creates, reads, deletes, and key events |
|
|
131
160
|
|
|
132
161
|
### Webhooks
|
|
133
162
|
|
|
@@ -137,24 +166,67 @@ SIRR_SERVER=http://localhost:39999 SIRR_TOKEN=mykey sirr-mcp --health
|
|
|
137
166
|
| `sirr_webhook_list()` | List all registered webhooks (signing secrets redacted) |
|
|
138
167
|
| `sirr_webhook_delete(id)` | Remove a webhook by ID |
|
|
139
168
|
|
|
140
|
-
###
|
|
169
|
+
### Principal keys
|
|
170
|
+
|
|
171
|
+
| Tool | Description |
|
|
172
|
+
|---|---|
|
|
173
|
+
| `sirr_key_list()` | List all API keys for the current principal |
|
|
174
|
+
| `sirr_create_key(name, valid_for_seconds?, valid_before?)` | Create a new API key; raw key returned once — save it |
|
|
175
|
+
| `sirr_delete_key(keyId)` | Revoke an API key by ID |
|
|
176
|
+
|
|
177
|
+
### Account (principal-scoped)
|
|
141
178
|
|
|
142
179
|
| Tool | Description |
|
|
143
180
|
|---|---|
|
|
144
|
-
| `
|
|
145
|
-
| `
|
|
146
|
-
|
|
181
|
+
| `sirr_me()` | Get the current principal's profile, role, and key list |
|
|
182
|
+
| `sirr_update_me(metadata)` | Replace the current principal's metadata |
|
|
183
|
+
|
|
184
|
+
### Organizations
|
|
185
|
+
|
|
186
|
+
| Tool | Description |
|
|
187
|
+
|---|---|
|
|
188
|
+
| `sirr_org_create(name, metadata?)` | Create a new organization |
|
|
189
|
+
| `sirr_org_list()` | List all organizations (master key only) |
|
|
190
|
+
| `sirr_org_delete(org_id)` | Delete an organization — must have no principals |
|
|
191
|
+
|
|
192
|
+
### Principals
|
|
193
|
+
|
|
194
|
+
| Tool | Description |
|
|
195
|
+
|---|---|
|
|
196
|
+
| `sirr_principal_create(org_id, name, role, metadata?)` | Create a principal (user or service account) in an org |
|
|
197
|
+
| `sirr_principal_list(org_id)` | List all principals in an org |
|
|
198
|
+
| `sirr_principal_delete(org_id, principal_id)` | Delete a principal — must have no active keys |
|
|
199
|
+
|
|
200
|
+
### Roles
|
|
201
|
+
|
|
202
|
+
| Tool | Description |
|
|
203
|
+
|---|---|
|
|
204
|
+
| `sirr_role_create(org_id, name, permissions)` | Create a custom role. Permissions: C=create R=read P=patch D=delete L=list M=manage A=admin |
|
|
205
|
+
| `sirr_role_list(org_id)` | List all roles in an org (built-in and custom) |
|
|
206
|
+
| `sirr_role_delete(org_id, role_name)` | Delete a custom role — must not be in use |
|
|
147
207
|
|
|
148
208
|
## Inline secret references
|
|
149
209
|
|
|
150
|
-
You can reference secrets inline in any prompt:
|
|
210
|
+
You can reference org-scoped secrets inline in any prompt:
|
|
151
211
|
|
|
152
212
|
```
|
|
153
213
|
"Use sirr:DATABASE_URL to run a migration"
|
|
154
214
|
"Deploy with sirr:DEPLOY_TOKEN"
|
|
155
215
|
```
|
|
156
216
|
|
|
157
|
-
The `sirr:KEYNAME` prefix tells Claude to fetch from the vault automatically.
|
|
217
|
+
The `sirr:KEYNAME` prefix tells Claude to fetch from the vault automatically (requires `SIRR_ORG` to be set).
|
|
218
|
+
|
|
219
|
+
## Secret lifecycle
|
|
220
|
+
|
|
221
|
+
Sirr secrets expire by design. Both `push_secret` and `set_secret` support expiry controls:
|
|
222
|
+
|
|
223
|
+
| Option | Behavior |
|
|
224
|
+
|---|---|
|
|
225
|
+
| `ttl_seconds: 3600` | Secret expires after 1 hour, regardless of reads |
|
|
226
|
+
| `max_reads: 1` | Secret is deleted after the first read |
|
|
227
|
+
| No options | Secret persists until explicitly deleted |
|
|
228
|
+
|
|
229
|
+
Use `check_secret` to inspect a secret's status without consuming a read — useful when you want to verify a secret is still available before fetching it.
|
|
158
230
|
|
|
159
231
|
## Security notes
|
|
160
232
|
|
|
@@ -169,9 +241,10 @@ The `sirr:KEYNAME` prefix tells Claude to fetch from the vault automatically.
|
|
|
169
241
|
|
|
170
242
|
| Symptom | Cause | Fix |
|
|
171
243
|
|---|---|---|
|
|
172
|
-
| `Error: Sirr 401` | `SIRR_TOKEN` doesn't match
|
|
173
|
-
| `Error: Sirr 402` | Free-tier limit
|
|
174
|
-
| `Error: Sirr 403` |
|
|
244
|
+
| `Error: Sirr 401` | `SIRR_TOKEN` doesn't match server key | Verify both values match exactly — no extra spaces or newlines. [sirr.dev/errors#401](https://sirr.dev/errors#401) |
|
|
245
|
+
| `Error: Sirr 402` | Free-tier limit reached | Delete unused secrets or upgrade. [sirr.dev/errors#402](https://sirr.dev/errors#402) |
|
|
246
|
+
| `Error: Sirr 403` | Token lacks the required permission | Use a token with the needed scope. [sirr.dev/errors#403](https://sirr.dev/errors#403) |
|
|
247
|
+
| `Error: Sirr 409` | Key already exists (`set_secret`) or resource has dependencies | Use `patch_secret` to update, or delete the secret first. For orgs: remove dependents first. [sirr.dev/errors#409](https://sirr.dev/errors#409) |
|
|
175
248
|
| `Secret '…' not found` | Secret expired, was burned, or key was mistyped | Re-push the secret if you still need it. [sirr.dev/errors#404](https://sirr.dev/errors#404) |
|
|
176
249
|
| `did not respond within 10s` | Sirr server is unreachable | Check `SIRR_SERVER` URL and confirm Sirr is running (`sirr-mcp --health`). |
|
|
177
250
|
| `[sirr-mcp] Warning: SIRR_TOKEN is not set` | Token missing from MCP config | Add `SIRR_TOKEN` to the `env` block in `.mcp.json`. |
|
package/dist/helpers.d.ts
CHANGED
|
@@ -8,6 +8,14 @@
|
|
|
8
8
|
* "KEYNAME" → "KEYNAME"
|
|
9
9
|
*/
|
|
10
10
|
export declare function parseKeyRef(ref: string): string;
|
|
11
|
+
export declare function secretsPath(key?: string): string;
|
|
12
|
+
/** Always routes to the public (unauthenticated) secrets endpoint. */
|
|
13
|
+
export declare function publicSecretsPath(id?: string): string;
|
|
14
|
+
/** Always routes to the org-scoped secrets endpoint. Throws if no org. */
|
|
15
|
+
export declare function orgSecretsPath(org: string, key?: string): string;
|
|
16
|
+
export declare function auditPath(): string;
|
|
17
|
+
export declare function webhooksPath(id?: string): string;
|
|
18
|
+
export declare function prunePath(): string;
|
|
11
19
|
/**
|
|
12
20
|
* Format a Unix timestamp (seconds) as a human-readable TTL string
|
|
13
21
|
* relative to now. Returns "no expiry" for null, "expired" for past timestamps.
|
package/dist/helpers.js
CHANGED
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.parseKeyRef = parseKeyRef;
|
|
7
|
+
exports.secretsPath = secretsPath;
|
|
8
|
+
exports.publicSecretsPath = publicSecretsPath;
|
|
9
|
+
exports.orgSecretsPath = orgSecretsPath;
|
|
10
|
+
exports.auditPath = auditPath;
|
|
11
|
+
exports.webhooksPath = webhooksPath;
|
|
12
|
+
exports.prunePath = prunePath;
|
|
7
13
|
exports.formatTtl = formatTtl;
|
|
8
14
|
/**
|
|
9
15
|
* Parse a secret key reference from natural language.
|
|
@@ -18,6 +24,34 @@ function parseKeyRef(ref) {
|
|
|
18
24
|
return ref.split("#")[0];
|
|
19
25
|
return ref.trim();
|
|
20
26
|
}
|
|
27
|
+
// ── Org-aware path helpers ────────────────────────────────────────────────────
|
|
28
|
+
function secretsPath(key) {
|
|
29
|
+
const org = process.env.SIRR_ORG;
|
|
30
|
+
const base = org ? `/orgs/${org}/secrets` : '/secrets';
|
|
31
|
+
return key ? `${base}/${key}` : base;
|
|
32
|
+
}
|
|
33
|
+
/** Always routes to the public (unauthenticated) secrets endpoint. */
|
|
34
|
+
function publicSecretsPath(id) {
|
|
35
|
+
return id ? `/secrets/${id}` : '/secrets';
|
|
36
|
+
}
|
|
37
|
+
/** Always routes to the org-scoped secrets endpoint. Throws if no org. */
|
|
38
|
+
function orgSecretsPath(org, key) {
|
|
39
|
+
const base = `/orgs/${org}/secrets`;
|
|
40
|
+
return key ? `${base}/${key}` : base;
|
|
41
|
+
}
|
|
42
|
+
function auditPath() {
|
|
43
|
+
const org = process.env.SIRR_ORG;
|
|
44
|
+
return org ? `/orgs/${org}/audit` : '/audit';
|
|
45
|
+
}
|
|
46
|
+
function webhooksPath(id) {
|
|
47
|
+
const org = process.env.SIRR_ORG;
|
|
48
|
+
const base = org ? `/orgs/${org}/webhooks` : '/webhooks';
|
|
49
|
+
return id ? `${base}/${id}` : base;
|
|
50
|
+
}
|
|
51
|
+
function prunePath() {
|
|
52
|
+
const org = process.env.SIRR_ORG;
|
|
53
|
+
return org ? `/orgs/${org}/prune` : '/prune';
|
|
54
|
+
}
|
|
21
55
|
/**
|
|
22
56
|
* Format a Unix timestamp (seconds) as a human-readable TTL string
|
|
23
57
|
* relative to now. Returns "no expiry" for null, "expired" for past timestamps.
|
package/dist/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAQH,kCAIC;AAMD,8BASC;
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/helpers.test.js
CHANGED
|
@@ -22,6 +22,74 @@ const helpers_1 = require("./helpers");
|
|
|
22
22
|
(0, globals_1.expect)((0, helpers_1.parseKeyRef)("KEY#a#b")).toBe("KEY");
|
|
23
23
|
});
|
|
24
24
|
});
|
|
25
|
+
(0, globals_1.describe)("secretsPath", () => {
|
|
26
|
+
(0, globals_1.afterEach)(() => {
|
|
27
|
+
delete process.env.SIRR_ORG;
|
|
28
|
+
});
|
|
29
|
+
(0, globals_1.it)("returns /secrets without SIRR_ORG", () => {
|
|
30
|
+
delete process.env.SIRR_ORG;
|
|
31
|
+
(0, globals_1.expect)((0, helpers_1.secretsPath)()).toBe("/secrets");
|
|
32
|
+
});
|
|
33
|
+
(0, globals_1.it)("returns /secrets/{key} without SIRR_ORG", () => {
|
|
34
|
+
delete process.env.SIRR_ORG;
|
|
35
|
+
(0, globals_1.expect)((0, helpers_1.secretsPath)("MY_KEY")).toBe("/secrets/MY_KEY");
|
|
36
|
+
});
|
|
37
|
+
(0, globals_1.it)("returns /orgs/{org}/secrets with SIRR_ORG", () => {
|
|
38
|
+
process.env.SIRR_ORG = "acme";
|
|
39
|
+
(0, globals_1.expect)((0, helpers_1.secretsPath)()).toBe("/orgs/acme/secrets");
|
|
40
|
+
});
|
|
41
|
+
(0, globals_1.it)("returns /orgs/{org}/secrets/{key} with SIRR_ORG", () => {
|
|
42
|
+
process.env.SIRR_ORG = "acme";
|
|
43
|
+
(0, globals_1.expect)((0, helpers_1.secretsPath)("MY_KEY")).toBe("/orgs/acme/secrets/MY_KEY");
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
(0, globals_1.describe)("auditPath", () => {
|
|
47
|
+
(0, globals_1.afterEach)(() => {
|
|
48
|
+
delete process.env.SIRR_ORG;
|
|
49
|
+
});
|
|
50
|
+
(0, globals_1.it)("returns /audit without SIRR_ORG", () => {
|
|
51
|
+
delete process.env.SIRR_ORG;
|
|
52
|
+
(0, globals_1.expect)((0, helpers_1.auditPath)()).toBe("/audit");
|
|
53
|
+
});
|
|
54
|
+
(0, globals_1.it)("returns /orgs/{org}/audit with SIRR_ORG", () => {
|
|
55
|
+
process.env.SIRR_ORG = "acme";
|
|
56
|
+
(0, globals_1.expect)((0, helpers_1.auditPath)()).toBe("/orgs/acme/audit");
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
(0, globals_1.describe)("webhooksPath", () => {
|
|
60
|
+
(0, globals_1.afterEach)(() => {
|
|
61
|
+
delete process.env.SIRR_ORG;
|
|
62
|
+
});
|
|
63
|
+
(0, globals_1.it)("returns /webhooks without SIRR_ORG", () => {
|
|
64
|
+
delete process.env.SIRR_ORG;
|
|
65
|
+
(0, globals_1.expect)((0, helpers_1.webhooksPath)()).toBe("/webhooks");
|
|
66
|
+
});
|
|
67
|
+
(0, globals_1.it)("returns /webhooks/{id} without SIRR_ORG", () => {
|
|
68
|
+
delete process.env.SIRR_ORG;
|
|
69
|
+
(0, globals_1.expect)((0, helpers_1.webhooksPath)("wh_123")).toBe("/webhooks/wh_123");
|
|
70
|
+
});
|
|
71
|
+
(0, globals_1.it)("returns /orgs/{org}/webhooks with SIRR_ORG", () => {
|
|
72
|
+
process.env.SIRR_ORG = "acme";
|
|
73
|
+
(0, globals_1.expect)((0, helpers_1.webhooksPath)()).toBe("/orgs/acme/webhooks");
|
|
74
|
+
});
|
|
75
|
+
(0, globals_1.it)("returns /orgs/{org}/webhooks/{id} with SIRR_ORG", () => {
|
|
76
|
+
process.env.SIRR_ORG = "acme";
|
|
77
|
+
(0, globals_1.expect)((0, helpers_1.webhooksPath)("wh_123")).toBe("/orgs/acme/webhooks/wh_123");
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
(0, globals_1.describe)("prunePath", () => {
|
|
81
|
+
(0, globals_1.afterEach)(() => {
|
|
82
|
+
delete process.env.SIRR_ORG;
|
|
83
|
+
});
|
|
84
|
+
(0, globals_1.it)("returns /prune without SIRR_ORG", () => {
|
|
85
|
+
delete process.env.SIRR_ORG;
|
|
86
|
+
(0, globals_1.expect)((0, helpers_1.prunePath)()).toBe("/prune");
|
|
87
|
+
});
|
|
88
|
+
(0, globals_1.it)("returns /orgs/{org}/prune with SIRR_ORG", () => {
|
|
89
|
+
process.env.SIRR_ORG = "acme";
|
|
90
|
+
(0, globals_1.expect)((0, helpers_1.prunePath)()).toBe("/orgs/acme/prune");
|
|
91
|
+
});
|
|
92
|
+
});
|
|
25
93
|
(0, globals_1.describe)("formatTtl", () => {
|
|
26
94
|
const realDateNow = Date.now;
|
|
27
95
|
(0, globals_1.beforeEach)(() => {
|
package/dist/helpers.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.test.js","sourceRoot":"","sources":["../src/helpers.test.ts"],"names":[],"mappings":";;AAAA,2CAAkF;AAClF,
|
|
1
|
+
{"version":3,"file":"helpers.test.js","sourceRoot":"","sources":["../src/helpers.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* Exposes Sirr as MCP tools so Claude Code can read/write ephemeral secrets.
|
|
6
6
|
*
|
|
7
7
|
* Configuration (env vars):
|
|
8
|
-
* SIRR_SERVER — Sirr server URL (default:
|
|
9
|
-
* SIRR_TOKEN — Bearer token
|
|
8
|
+
* SIRR_SERVER — Sirr server URL (default: https://sirr.sirrlock.com)
|
|
9
|
+
* SIRR_TOKEN — Bearer token: SIRR_MASTER_KEY for full access, or a principal key for org-scoped access
|
|
10
10
|
*
|
|
11
11
|
* Install: npm install -g @sirrlock/mcp
|
|
12
12
|
* Configure in .mcp.json:
|