@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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EACL,WAAW,EACX,MAAM,IAAI,QAAQ,EAClB,eAAe,GAGhB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEvF,MAAM,MAAM,GAAG,SAAS,CAAwD,QAAQ,CAAC,CAAC;AAE1F,uEAAuE;AACvE,sEAAsE;AACtE,wBAAwB;AACxB,MAAM,QAAQ,GAAG,KAAK,CAAC;AACvB,MAAM,QAAQ,GAAG,CAAC,CAAC;AACnB,MAAM,QAAQ,GAAG,CAAC,CAAC;AACnB,MAAM,aAAa,GAAG,EAAE,CAAC;AAkDzB,uEAAuE;AAEvE,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAAiB;IACrD,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE;QACvD,CAAC,EAAE,QAAQ;QACX,CAAC,EAAE,QAAQ;QACX,CAAC,EAAE,QAAQ;KACZ,CAAC,CAAW,CAAC;IACd,OAAO,UAAU,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;AAC1G,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,SAAiB,EAAE,MAAc;IACvE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACvF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,QAAQ,CAAC,CAAC;IAClD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,MAAM,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAW,CAAC;IACtF,OAAO,EAAE,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,IAAI,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;AACxE,CAAC;AAED,uEAAuE;AAEvE,mEAAmE;AACnE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,CAAU,EAAE,KAAa;IAC3D,OAAO,CAAC,CACN,
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
63
|
+
ON vk_mcp_tokens (scope, created_at DESC);
|