@venturekit/mcp 0.0.0-dev.20260701100017 → 0.0.1

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.
@@ -27,7 +27,7 @@
27
27
 
28
28
  CREATE EXTENSION IF NOT EXISTS pgcrypto;
29
29
 
30
- CREATE TABLE IF NOT EXISTS mcp_tokens (
30
+ CREATE TABLE IF NOT EXISTS vk_mcp_tokens (
31
31
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
32
32
  -- Owner key. Host-defined; the CMS uses the tenant slug. Also the
33
33
  -- `vk_<scope>_…` segment of the plaintext, so the verifier can narrow
@@ -52,12 +52,12 @@ CREATE TABLE IF NOT EXISTS mcp_tokens (
52
52
  -- Label is unique per scope: stops accidental dupes in the UI and
53
53
  -- bounds the verifier's prefix-collision hash loop.
54
54
  CREATE UNIQUE INDEX IF NOT EXISTS mcp_tokens_scope_label_unique
55
- ON mcp_tokens (scope, lower(label));
55
+ ON vk_mcp_tokens (scope, lower(label));
56
56
 
57
57
  -- Verifier hot path: WHERE scope = $1 AND prefix = $2 AND revoked_at IS NULL.
58
58
  CREATE INDEX IF NOT EXISTS mcp_tokens_lookup_idx
59
- ON mcp_tokens (scope, prefix) WHERE revoked_at IS NULL;
59
+ ON vk_mcp_tokens (scope, prefix) WHERE revoked_at IS NULL;
60
60
 
61
61
  -- Owner list: WHERE scope = $1 ORDER BY created_at DESC.
62
62
  CREATE INDEX IF NOT EXISTS mcp_tokens_scope_created_idx
63
- ON mcp_tokens (scope, created_at DESC);
63
+ ON vk_mcp_tokens (scope, created_at DESC);
package/dist/store.js CHANGED
@@ -58,7 +58,7 @@ export async function verifyTokenSecret(plaintext, stored) {
58
58
  // ─── Read ───────────────────────────────────────────────────────────
59
59
  /** List every token for an owner, newest-first (incl. revoked). */
60
60
  export async function listMcpTokens(q, scope) {
61
- return q(`SELECT * FROM mcp_tokens WHERE scope = $1 ORDER BY created_at DESC`, [scope]);
61
+ return q(`SELECT * FROM vk_mcp_tokens WHERE scope = $1 ORDER BY created_at DESC`, [scope]);
62
62
  }
63
63
  // ─── Write ──────────────────────────────────────────────────────────
64
64
  /** Mint a token for `scope`. Returns the persisted row + the plaintext (once). */
@@ -66,7 +66,7 @@ export async function createMcpToken(q, input) {
66
66
  const { token, prefix } = generateBearerToken({ scope: input.scope });
67
67
  const tokenHash = await hashTokenSecret(token);
68
68
  const allowedTools = input.allowedTools && input.allowedTools.length > 0 ? input.allowedTools.join(',') : null;
69
- const rows = await q(`INSERT INTO mcp_tokens (scope, label, prefix, token_hash, allowed_tools, created_by)
69
+ const rows = await q(`INSERT INTO vk_mcp_tokens (scope, label, prefix, token_hash, allowed_tools, created_by)
70
70
  VALUES ($1, $2, $3, $4, $5, $6)
71
71
  RETURNING *`, [input.scope, input.label, prefix, tokenHash, allowedTools, input.createdBy ?? null]);
72
72
  const row = rows[0];
@@ -79,7 +79,7 @@ export async function createMcpToken(q, input) {
79
79
  * `revoked_at`). Returns `null` when the id doesn't exist for `scope`.
80
80
  */
81
81
  export async function revokeMcpToken(q, scope, id) {
82
- const rows = await q(`UPDATE mcp_tokens
82
+ const rows = await q(`UPDATE vk_mcp_tokens
83
83
  SET revoked_at = COALESCE(revoked_at, NOW())
84
84
  WHERE scope = $1 AND id = $2
85
85
  RETURNING *`, [scope, id]);
@@ -98,11 +98,11 @@ export async function verifyMcpToken(q, plaintext) {
98
98
  if (!parsed)
99
99
  return null;
100
100
  const prefix = bearerTokenPrefix(plaintext);
101
- const candidates = await q(`SELECT * FROM mcp_tokens WHERE scope = $1 AND prefix = $2 AND revoked_at IS NULL`, [parsed.scope, prefix]);
101
+ const candidates = await q(`SELECT * FROM vk_mcp_tokens WHERE scope = $1 AND prefix = $2 AND revoked_at IS NULL`, [parsed.scope, prefix]);
102
102
  for (const row of candidates) {
103
103
  if (await verifyTokenSecret(plaintext, row.tokenHash)) {
104
104
  // Best-effort touch — never block a valid auth on a stats write.
105
- Promise.resolve(q(`UPDATE mcp_tokens SET last_used_at = NOW() WHERE id = $1`, [row.id])).catch(() => { });
105
+ Promise.resolve(q(`UPDATE vk_mcp_tokens SET last_used_at = NOW() WHERE id = $1`, [row.id])).catch(() => { });
106
106
  return row;
107
107
  }
108
108
  }
package/dist/store.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@venturekit/mcp",
3
- "version": "0.0.0-dev.20260701100017",
3
+ "version": "0.0.1",
4
4
  "description": "Transport-agnostic Model Context Protocol (MCP) server primitives for VentureKit: JSON-RPC dispatch, a typed tool registry, and a Zod→JSON-Schema serializer.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -14,9 +14,13 @@
14
14
  },
15
15
  "repository": {
16
16
  "type": "git",
17
- "url": "https://github.com/venturekit-dev/venturekit.private.git",
17
+ "url": "https://github.com/venturekit-dev/venturekit.git",
18
18
  "directory": "packages/mcp"
19
19
  },
20
+ "homepage": "https://venturekit.dev",
21
+ "bugs": {
22
+ "url": "https://github.com/venturekit-dev/venturekit/issues"
23
+ },
20
24
  "publishConfig": {
21
25
  "registry": "https://registry.npmjs.org",
22
26
  "access": "public"
@@ -27,7 +27,7 @@
27
27
 
28
28
  CREATE EXTENSION IF NOT EXISTS pgcrypto;
29
29
 
30
- CREATE TABLE IF NOT EXISTS mcp_tokens (
30
+ CREATE TABLE IF NOT EXISTS vk_mcp_tokens (
31
31
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
32
32
  -- Owner key. Host-defined; the CMS uses the tenant slug. Also the
33
33
  -- `vk_<scope>_…` segment of the plaintext, so the verifier can narrow
@@ -52,12 +52,12 @@ CREATE TABLE IF NOT EXISTS mcp_tokens (
52
52
  -- Label is unique per scope: stops accidental dupes in the UI and
53
53
  -- bounds the verifier's prefix-collision hash loop.
54
54
  CREATE UNIQUE INDEX IF NOT EXISTS mcp_tokens_scope_label_unique
55
- ON mcp_tokens (scope, lower(label));
55
+ ON vk_mcp_tokens (scope, lower(label));
56
56
 
57
57
  -- Verifier hot path: WHERE scope = $1 AND prefix = $2 AND revoked_at IS NULL.
58
58
  CREATE INDEX IF NOT EXISTS mcp_tokens_lookup_idx
59
- ON mcp_tokens (scope, prefix) WHERE revoked_at IS NULL;
59
+ ON vk_mcp_tokens (scope, prefix) WHERE revoked_at IS NULL;
60
60
 
61
61
  -- Owner list: WHERE scope = $1 ORDER BY created_at DESC.
62
62
  CREATE INDEX IF NOT EXISTS mcp_tokens_scope_created_idx
63
- ON mcp_tokens (scope, created_at DESC);
63
+ ON vk_mcp_tokens (scope, created_at DESC);