@jaypie/mcp 0.8.44 → 0.8.45

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.
@@ -9,7 +9,7 @@ import { gt } from 'semver';
9
9
  /**
10
10
  * Docs Suite - Documentation services (skill, version, release_notes)
11
11
  */
12
- const BUILD_VERSION_STRING = "@jaypie/mcp@0.8.44#b696c1bf"
12
+ const BUILD_VERSION_STRING = "@jaypie/mcp@0.8.45#115144e4"
13
13
  ;
14
14
  const __filename$1 = fileURLToPath(import.meta.url);
15
15
  const __dirname$1 = path.dirname(__filename$1);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jaypie/mcp",
3
- "version": "0.8.44",
3
+ "version": "0.8.45",
4
4
  "description": "Jaypie MCP",
5
5
  "repository": {
6
6
  "type": "git",
@@ -0,0 +1,11 @@
1
+ ---
2
+ version: 1.2.42
3
+ date: 2026-04-19
4
+ summary: Re-export jaypieApiKeyId and HTTP.HEADER.API_KEY via @jaypie/kit
5
+ ---
6
+
7
+ ## Changes
8
+
9
+ - Bumped `@jaypie/kit` to `^1.2.8`, exposing:
10
+ - `jaypieApiKeyId(key, { namespace, salt? })` — derives a deterministic UUIDv5 from a hashed API key
11
+ - `HTTP.HEADER.API_KEY` (`"X-Api-Key"`)
@@ -0,0 +1,13 @@
1
+ ---
2
+ version: 1.2.8
3
+ date: 2026-04-19
4
+ summary: Add jaypieApiKeyId helper and X-Api-Key HTTP header constant
5
+ ---
6
+
7
+ ## Changes
8
+
9
+ - Added `jaypieApiKeyId(key, { namespace, salt? })` — derives a deterministic UUIDv5 from the hashed key, suitable for use as a user-facing DynamoDB id
10
+ - Same key + namespace always produces the same id; preserves direct `get-item` lookup (no GSI)
11
+ - Namespace is required (consumer-scoped) to avoid cross-application collisions
12
+ - `salt` passes through to `hashJaypieKey` (defaults to `process.env.PROJECT_SALT`)
13
+ - Added `HTTP.HEADER.API_KEY` (`"X-Api-Key"`) to the HTTP header constants
@@ -0,0 +1,12 @@
1
+ ---
2
+ version: 0.8.45
3
+ date: 2026-04-19
4
+ summary: Document jaypieApiKeyId helper and UUIDv5 DynamoDB id pattern in the apikey skill
5
+ ---
6
+
7
+ ## Changes
8
+
9
+ - Updated `skill("apikey")`:
10
+ - Added a "Derive UUID Id" section documenting `jaypieApiKeyId(key, { namespace, salt? })`
11
+ - Reworked the "DynamoDB Storage Pattern" section to recommend UUIDv5-from-hash as the primary pattern when the id is user-facing, with the raw hex hash pattern documented as the alternative for hidden presentation
12
+ - Contrasted both approaches with the `xid = hash` + GSI pattern
@@ -0,0 +1,9 @@
1
+ ---
2
+ version: 1.2.36
3
+ date: 2026-04-19
4
+ summary: Add jaypieApiKeyId mock
5
+ ---
6
+
7
+ ## Changes
8
+
9
+ - Added `jaypieApiKeyId` mock — returns the fixed UUID `"00000000-0000-5000-8000-000000000000"`
package/skills/apikey.md CHANGED
@@ -5,7 +5,7 @@ related: dynamodb, secrets, style, tests
5
5
 
6
6
  # API Keys
7
7
 
8
- Jaypie provides three functions for working with API keys: `generateJaypieKey`, `validateJaypieKey`, and `hashJaypieKey`. Available from `jaypie` or `@jaypie/kit`.
8
+ Jaypie provides four functions for working with API keys: `generateJaypieKey`, `validateJaypieKey`, `hashJaypieKey`, and `jaypieApiKeyId`. Available from `jaypie` or `@jaypie/kit`.
9
9
 
10
10
  ## Generate
11
11
 
@@ -144,6 +144,29 @@ Returns a 64-character hex string. Deterministic — same key and salt always pr
144
144
  2. `process.env.PROJECT_SALT` environment variable
145
145
  3. No salt — plain SHA-256 (logs a warning)
146
146
 
147
+ ## Derive UUID Id
148
+
149
+ > **Version note:** `jaypieApiKeyId` requires `jaypie >= 1.2.22` / `@jaypie/kit >= 1.2.8`.
150
+
151
+ `jaypieApiKeyId(key, { namespace, salt? })` derives a deterministic UUIDv5 from the hashed key. Use this when the id must be surfaced in UIs, API responses, or resource URLs — a 64-char hex hash is not ergonomic, but a UUID is:
152
+
153
+ ```typescript
154
+ import { jaypieApiKeyId } from "jaypie";
155
+
156
+ const APIKEY_NAMESPACE = "b85e1a7a-5c7e-4e7b-9b8e-7c3a9d2f4e5b";
157
+
158
+ const id = jaypieApiKeyId(key, { namespace: APIKEY_NAMESPACE });
159
+ // "c4e1b0d2-..."
160
+ ```
161
+
162
+ Properties:
163
+
164
+ - **Deterministic** — same key + namespace always produces the same id; auth stays `getEntity({ id })`, still no GSI required
165
+ - **One-way** — derives from the hash, so the plaintext key cannot be recovered
166
+ - **Presentable** — a standard UUID, safe to expose externally
167
+
168
+ Pick a stable namespace UUID per application (a random UUIDv4 is fine) so ids cannot collide across unrelated services.
169
+
147
170
  ## Typical Workflow
148
171
 
149
172
  1. **Generate** a key and return it to the user (only time plaintext is visible)
@@ -216,14 +239,33 @@ See `~secrets` for the full secrets management pattern.
216
239
 
217
240
  ## DynamoDB Storage Pattern
218
241
 
219
- Store hashed API keys in DynamoDB for direct lookup without a GSI:
242
+ Store API keys in DynamoDB keyed on a deterministic id derived from the plaintext. Both patterns preserve direct `get-item` lookup (no GSI).
243
+
244
+ ### Preferred: UUIDv5 from hash (id safe to expose)
245
+
246
+ ```typescript
247
+ const APIKEY_NAMESPACE = "b85e1a7a-5c7e-4e7b-9b8e-7c3a9d2f4e5b";
248
+
249
+ // model = "apikey", id = uuidv5(hash, namespace) — standard UUID, safe to surface
250
+ { model: "apikey", id: jaypieApiKeyId(key, { namespace: APIKEY_NAMESPACE }), ownerId: "user_123", createdAt: "..." }
251
+ ```
252
+
253
+ Use this when the id will appear in API responses, UI, or resource URLs. Auth stays a single `getEntity({ model: "apikey", id: jaypieApiKeyId(presented, { namespace }) })`.
254
+
255
+ ### Alternative: Raw hash id (hidden presentation)
220
256
 
221
257
  ```typescript
222
- // model = "apikey", id = hash — enables direct get-item lookup
258
+ // model = "apikey", id = hash — a 64-char hex string, functional but not ergonomic
223
259
  { model: "apikey", id: hashJaypieKey(key), ownerId: "user_123", createdAt: "..." }
224
260
  ```
225
261
 
226
- This uses the `JaypieDynamoDb` default key convention (`model`/`id`). See `skill("dynamodb")` for table setup and query patterns.
262
+ Use when presentation does not matter internal-only tables, throwaway tooling, or when you are already storing a separate public identifier.
263
+
264
+ Both patterns use the `JaypieDynamoDb` default key convention (`model`/`id`). See `skill("dynamodb")` for table setup and query patterns.
265
+
266
+ ### Why not `xid = hash` with a GSI?
267
+
268
+ Another common pattern is `{ id: randomUUID(), xid: hashJaypieKey(key) }` with a GSI on `xid`. It works, but every auth lookup becomes a `query` against a GSI instead of a `get-item`, and you pay the per-deploy cost of an extra index. The UUIDv5 derivation sidesteps both by keeping the id deterministic.
227
269
 
228
270
  ## See Also
229
271