@jmtrin/kevin-mcp 1.5.0 → 2.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.
Files changed (2) hide show
  1. package/README.md +242 -240
  2. package/package.json +33 -35
package/README.md CHANGED
@@ -1,240 +1,242 @@
1
- <div align="center">
2
-
3
- # ⚡ Kevin MCP — Bridge
4
-
5
- ```
6
- ╔══════════════════════════════════════════════╗
7
- ║ @jmtrin/kevin-mcp 1.4.0 ║
8
- ║ MCP Bridge for Kevin ║
9
- ║ stdio · zero network · WAL ║
10
- ╚══════════════════════════════════════════════╝
11
- ```
12
-
13
- ### Same SQLite, every harness — Kevin via Model Context Protocol
14
-
15
- **Kevin MCP exposes the local `kevin.db` to Claude Code, Codex, Cursor, Windsurf, Gemini CLI and Opencode through one stdio server.**
16
-
17
- ![version](https://img.shields.io/badge/version-1.4.0-blue)
18
- ![node](https://img.shields.io/badge/node-%E2%89%A522.5-green)
19
- ![mcp](https://img.shields.io/badge/MCP-1.30.0-purple)
20
- ![transport](https://img.shields.io/badge/transport-stdio-black)
21
- ![license](https://img.shields.io/badge/license-MIT-lightgrey)
22
-
23
- </div>
24
-
25
- > **No new database. No HTTP. One WAL file, two processes.**
26
-
27
- ---
28
-
29
- ## 📖 Contents
30
-
31
- - [Why a Bridge](#-why-a-bridge)
32
- - [Quick start](#-quick-start)
33
- - [Tools (11)](#-tools-11)
34
- - [Reads vs writes — gates](#-reads-vs-writes--gates)
35
- - [Identity & repo scope](#-identity--repo-scope)
36
- - [Provenance](#-provenance)
37
- - [Harnesses](#-harnesses)
38
- - [Architecture](#-architecture)
39
- - [Configuration](#%EF%B8%8F-configuration)
40
- - [Latency budgets](#-latency-budgets)
41
- - [Development](#-development)
42
- - [License](#-license)
43
-
44
- ---
45
-
46
- ## 🤔 Why a Bridge
47
-
48
- OpenCode plugin memory is excellent inside OpenCode. The bridge makes that same ranked recall available to **any MCP host** without a second sync, a server, or a cloud hop.
49
-
50
- | Before | After |
51
- |---|---|
52
- | `kevin.db` only reachable from plugin | `kevin.db` shared via WAL + `busy_timeout=5000` |
53
- | one host | 6 harnesses (Claude Code / Codex / Cursor / Windsurf / Gemini CLI / Opencode) |
54
-
55
- ---
56
-
57
- ## 🚀 Quick start
58
-
59
- ```bash
60
- npx -y @jmtrin/kevin-mcp # ro by default, stderr ready line
61
- npx -y @jmtrin/kevin-mcp --repo 2114ad162af50a25 # pinned repo_id
62
- npx -y @jmtrin/kevin-mcp --help
63
- ```
64
-
65
- ### Claude Code (`~/.claude.json`)
66
-
67
- ```json
68
- {
69
- "mcpServers": {
70
- "kevin-mcp": { "command": "npx", "args": ["-y", "@jmtrin/kevin-mcp"] }
71
- }
72
- }
73
- ```
74
-
75
- ### Codex / Cursor / Windsurf / Gemini CLI
76
-
77
- See `docs/harnesses/{codex,cursor,windsurf,gemini-cli,opencode}.md` for exact JSON/TOML snippets, verification (`npx @jmtrin/kevin-mcp --version`), troubleshooting and uninstall.
78
-
79
- ### How to verify inside a host
80
-
81
- ```
82
- what does Kevin remember about <topic>?
83
- → recall returns results + provenance {repo_id, identity_source, channel:"mcp"}
84
- ```
85
-
86
- ---
87
-
88
- ## 🧰 Tools (11)
89
-
90
- <details open>
91
- <summary><b>Always-on reads (7) + ping</b></summary>
92
-
93
- | Tool | What it does | Ledger |
94
- |---|---|---|
95
- | `ping` | Liveness probe | |
96
- | `query` | Slim search | — |
97
- | `get` | Fetch one memory | — |
98
- | `recall` | Ranked recall (BM25 × origin × recency → token budget) | `channel='mcp'` injection row, tokens `ceil(chars/4)` |
99
- | `why` | Failure→fix trace via `kevinWhy` | — |
100
- | `status` | `{repo_id, resolved_repo_id, requested_repo_id, gates, counters{requests,reads,writes_accepted/refused}, perf}` | — |
101
- | `trace` | Dry-run injection preview, zero side effects | — |
102
- | `feedback` | Rate a memory `useful/wrong/outdated/ignore` | — |
103
-
104
- Every read returns `provenance: {repo_id, identity_source, channel:"mcp"}` plus confidence/evidence when the underlying row carries them.
105
-
106
- </details>
107
-
108
- <details>
109
- <summary><b>Gated writes (3) — disabled by default</b></summary>
110
-
111
- | Tool | Gate | On refuse |
112
- |---|---|---|
113
- | `save` | `mcp_write_enabled==='1'` | `{error:"disabled", hint:"set mcp_write_enabled=1"}` + `mcp_writes_refused++` |
114
- | `approve` | `mcp_write_enabled==='1'` **and** `mcp_approve_enabled==='1'` | same (`disabled`) |
115
- | `share` | double-gate as `approve` (and existing `share_requires_approval` chain) | `disabled` `missing_approval_chain` `executed` |
116
-
117
- On success `mcp_writes_accepted++`. All writes are repo-scoped and funnel through core's single write path.
118
-
119
- </details>
120
-
121
- ---
122
-
123
- ## 🔐 Identity & repo scope
124
-
125
- Repository identity resolves **once** at server init, in order:
126
-
127
- `--repo <id>` (`KEVIN_REPO`) `kevin_settings.mcp_repo_override` (`setting:mcp_repo_override`) `RepoIdentity.resolve` (declared → remote hash → path).
128
-
129
- Every tool carries an optional `repo_id` arg; mismatch returns:
130
-
131
- ```json
132
- { "error": "repo_mismatch", "expected": "<server repo_id>", "got": "<caller repo_id>" }
133
- ```
134
-
135
- Declared ids must be 16-char lowercase hex (`/^[0-9a-f]{16}$/`).
136
-
137
- ---
138
-
139
- ## 🧾 Provenance
140
-
141
- ```json
142
- {
143
- "provenance": {
144
- "repo_id": "2114ad162af50a25",
145
- "identity_source": "setting:mcp_repo_override",
146
- "channel": "mcp"
147
- }
148
- }
149
- ```
150
-
151
- When the memory row has confidence/evidence, those fields surface as `confidence`, `evidence_count`, `last_verified_at`.
152
-
153
- ---
154
-
155
- ## 🔌 Harnesses
156
-
157
- | Harness | Recipe | Tested-on |
158
- |---|---|---|
159
- | Claude Code | `docs/harnesses/claude-code.md` | claude-code v1.0.0 |
160
- | Codex | `docs/harnesses/codex.md` | codex v0.5.0 |
161
- | Cursor | `docs/harnesses/cursor.md` | cursor v1.2.0 |
162
- | Windsurf | `docs/harnesses/windsurf.md` | windsurf v1.0 |
163
- | Gemini CLI | `docs/harnesses/gemini-cli.md` | gemini-cli v0.4.0 |
164
- | Opencode | `docs/harnesses/opencode.md` | opencode v1.18.0 |
165
-
166
- Each recipe is a tested JSON/TOML block (parsed by `tests/unit/docs_config_lint.test.ts`), verification command, troubleshooting and uninstall note. Demo: `docs/demo-cross-harness.md` (10-min `▶` script: opencode `save` → Claude Code `recall`).
167
-
168
- ---
169
-
170
- ## ⚙️ Architecture
171
-
172
- ```
173
- plugin (opencode) ─┐
174
- ├─► kevin.db (WAL, busy_timeout=5000) ◄─ kevin-mcp (stdio, SDK 1.30.0)
175
- MCP host (any) ────┘ │ ▲ │
176
- │ └─ kevin_audit mcp block ─┘
177
- └── perf_samples (mcp.read/write)
178
- ```
179
-
180
- - **Zero network** — forbidden list enforced: `node:http/https/net/dgram, fetch, XMLHttpRequest, SSETransport, HttpTransport, child_process/spawn`; only `node:fs/path/os/sqlite`.
181
- - **Logs on stderr only** — `stderr ready repo=... mode=ro|rw db=...`; stdout is MCP JSON only.
182
- - **Lifecycle** — `resolveEnv Store(busy_timeout) Migrate(013) Metrics+Perf registry`; SIGINT/SIGTERM flush metrics + perf (every 100 req or signal).
183
-
184
- Package layout:
185
-
186
- ```
187
- src/server.ts lifecycle, registry, ready line, signals
188
- src/identity.ts resolution + mismatch guard
189
- src/tools/read.ts 7 reads + ping + provenance helper
190
- src/tools/write.ts 3 gated writes
191
- src/provenance.ts block builder
192
- src/perf-mcp.ts mcp.read/write budgets wrapper
193
- ```
194
-
195
- ---
196
-
197
- ## ⚙️ Configuration
198
-
199
- Text settings via `kevin_config` (compare `=== "1"`):
200
-
201
- | Key | Default | Purpose |
202
- |---|---|---|
203
- | `mcp_write_enabled` | `'0'` | Gate for MCP `save` |
204
- | `mcp_approve_enabled` | `'0'` | Double-gate for MCP `approve`/`share` |
205
- | `mcp_repo_override` | `''` | Override RepoIdentity (hex-16) |
206
-
207
- Plus the 32 core/plugin keys (`C-04` since `1.4.0` golden 35 settings). `kevin_audit` block `mcp` appears only on schema `013`+; pre-013 omitted (`partial:true`). Channel split counters in `kevin_metrics` + `kevin_injections.channel`.
208
-
209
- ---
210
-
211
- ## ⏱️ Latency budgets
212
-
213
- | Scope | p95 | max |
214
- |---|---|---|
215
- | `mcp.read` | 25 ms | 100 ms |
216
- | `mcp.write` | 50 ms | 250 ms |
217
-
218
- Measured on reference laptop: recall p50 ≈ 0.2ms. Persists to `perf_samples` every 100 requests or SIGINT; `bench:check` enforces.
219
-
220
- ---
221
-
222
- ## 🛠️ Development
223
-
224
- ```bash
225
- npm install -w @jmtrin/kevin-mcp
226
- npm run build -w @jmtrin/kevin-mcp
227
- npm run typecheck -w @jmtrin/kevin-mcp
228
- npx vitest run packages/mcp/tests/purity_scan.test.ts
229
- npm pack --dry-run -w @jmtrin/kevin-mcp
230
- # boot smoke (no stdout, stderr ready):
231
- node packages/mcp/dist/server.js --help
232
- ```
233
-
234
- Monorepo publish order: `core → tui → plugin → mcp` (exact `1.4.0` pin), see `docs/DISTRIBUTION.md`.
235
-
236
- ---
237
-
238
- ## 📄 License
239
-
240
- MIT see `LICENSE`. Kevin is built by [jmtrin](https://github.com/jmtrin); bug reports and PRs welcome at the [issue tracker](https://github.com/jmtrin/opencode-kevin/issues).
1
+ <div align="center">
2
+
3
+ # ⚡ Kevin MCP — Bridge
4
+
5
+ ```
6
+ ╔══════════════════════════════════════════════╗
7
+ ║ @jmtrin/kevin-mcp 2.0.0 ║
8
+ ║ MCP Bridge for Kevin ║
9
+ ║ stdio · zero network · WAL ║
10
+ ╚══════════════════════════════════════════════╝
11
+ ```
12
+
13
+ ### Same SQLite, every harness — Kevin via Model Context Protocol
14
+
15
+ **Kevin MCP exposes the local `kevin.db` to Claude Code, Codex, Cursor, Windsurf, Gemini CLI and Opencode through one stdio server.**
16
+
17
+ ![version](https://img.shields.io/badge/version-2.0.0-blue)
18
+ ![node](https://img.shields.io/badge/node-%E2%89%A522.5-green)
19
+ ![mcp](https://img.shields.io/badge/MCP-1.30.0-purple)
20
+ ![transport](https://img.shields.io/badge/transport-stdio-black)
21
+ ![license](https://img.shields.io/badge/license-MIT-lightgrey)
22
+
23
+ </div>
24
+
25
+ > **No new database. No HTTP. One WAL file, two processes.**
26
+
27
+ > **Commonwealth (2.0.0):** same bridge, same WAL, now with `kevin_sources` provenance and sharded OKF v3 support (`014`) — reader walks `knowledge/` shards, writer gated by `okf_write_version`.
28
+
29
+ ---
30
+
31
+ ## 📖 Contents
32
+
33
+ - [Why a Bridge](#-why-a-bridge)
34
+ - [Quick start](#-quick-start)
35
+ - [Tools (11)](#-tools-11)
36
+ - [Reads vs writes — gates](#-reads-vs-writes--gates)
37
+ - [Identity & repo scope](#-identity--repo-scope)
38
+ - [Provenance](#-provenance)
39
+ - [Harnesses](#-harnesses)
40
+ - [Architecture](#-architecture)
41
+ - [Configuration](#%EF%B8%8F-configuration)
42
+ - [Latency budgets](#-latency-budgets)
43
+ - [Development](#-development)
44
+ - [License](#-license)
45
+
46
+ ---
47
+
48
+ ## 🤔 Why a Bridge
49
+
50
+ OpenCode plugin memory is excellent inside OpenCode. The bridge makes that same ranked recall available to **any MCP host** without a second sync, a server, or a cloud hop.
51
+
52
+ | Before | After |
53
+ |---|---|
54
+ | `kevin.db` only reachable from plugin | `kevin.db` shared via WAL + `busy_timeout=5000` |
55
+ | one host | 6 harnesses (Claude Code / Codex / Cursor / Windsurf / Gemini CLI / Opencode) |
56
+
57
+ ---
58
+
59
+ ## 🚀 Quick start
60
+
61
+ ```bash
62
+ npx -y @jmtrin/kevin-mcp # ro by default, stderr ready line
63
+ npx -y @jmtrin/kevin-mcp --repo 2114ad162af50a25 # pinned repo_id
64
+ npx -y @jmtrin/kevin-mcp --help
65
+ ```
66
+
67
+ ### Claude Code (`~/.claude.json`)
68
+
69
+ ```json
70
+ {
71
+ "mcpServers": {
72
+ "kevin-mcp": { "command": "npx", "args": ["-y", "@jmtrin/kevin-mcp"] }
73
+ }
74
+ }
75
+ ```
76
+
77
+ ### Codex / Cursor / Windsurf / Gemini CLI
78
+
79
+ See `docs/harnesses/{codex,cursor,windsurf,gemini-cli,opencode}.md` for exact JSON/TOML snippets, verification (`npx @jmtrin/kevin-mcp --version`), troubleshooting and uninstall.
80
+
81
+ ### How to verify inside a host
82
+
83
+ ```
84
+ what does Kevin remember about <topic>?
85
+ → recall returns results + provenance {repo_id, identity_source, channel:"mcp"}
86
+ ```
87
+
88
+ ---
89
+
90
+ ## 🧰 Tools (11)
91
+
92
+ <details open>
93
+ <summary><b>Always-on reads (7) + ping</b></summary>
94
+
95
+ | Tool | What it does | Ledger |
96
+ |---|---|---|
97
+ | `ping` | Liveness probe | — |
98
+ | `query` | Slim search | |
99
+ | `get` | Fetch one memory | — |
100
+ | `recall` | Ranked recall (BM25 × origin × recency → token budget) | `channel='mcp'` injection row, tokens `ceil(chars/4)` |
101
+ | `why` | Failure→fix trace via `kevinWhy` | — |
102
+ | `status` | `{repo_id, resolved_repo_id, requested_repo_id, gates, counters{requests,reads,writes_accepted/refused}, perf}` | — |
103
+ | `trace` | Dry-run injection preview, zero side effects | — |
104
+ | `feedback` | Rate a memory `useful/wrong/outdated/ignore` | |
105
+
106
+ Every read returns `provenance: {repo_id, identity_source, channel:"mcp"}` plus confidence/evidence when the underlying row carries them.
107
+
108
+ </details>
109
+
110
+ <details>
111
+ <summary><b>Gated writes (3) disabled by default</b></summary>
112
+
113
+ | Tool | Gate | On refuse |
114
+ |---|---|---|
115
+ | `save` | `mcp_write_enabled==='1'` | `{error:"disabled", hint:"set mcp_write_enabled=1"}` + `mcp_writes_refused++` |
116
+ | `approve` | `mcp_write_enabled==='1'` **and** `mcp_approve_enabled==='1'` | same (`disabled`) |
117
+ | `share` | double-gate as `approve` (and existing `share_requires_approval` chain) | `disabled` → `missing_approval_chain` → `executed` |
118
+
119
+ On success `mcp_writes_accepted++`. All writes are repo-scoped and funnel through core's single write path.
120
+
121
+ </details>
122
+
123
+ ---
124
+
125
+ ## 🔐 Identity & repo scope
126
+
127
+ Repository identity resolves **once** at server init, in order:
128
+
129
+ `--repo <id>` (`KEVIN_REPO`) `kevin_settings.mcp_repo_override` (`setting:mcp_repo_override`) `RepoIdentity.resolve` (declared → remote hash → path).
130
+
131
+ Every tool carries an optional `repo_id` arg; mismatch returns:
132
+
133
+ ```json
134
+ { "error": "repo_mismatch", "expected": "<server repo_id>", "got": "<caller repo_id>" }
135
+ ```
136
+
137
+ Declared ids must be 16-char lowercase hex (`/^[0-9a-f]{16}$/`).
138
+
139
+ ---
140
+
141
+ ## 🧾 Provenance
142
+
143
+ ```json
144
+ {
145
+ "provenance": {
146
+ "repo_id": "2114ad162af50a25",
147
+ "identity_source": "setting:mcp_repo_override",
148
+ "channel": "mcp"
149
+ }
150
+ }
151
+ ```
152
+
153
+ When the memory row has confidence/evidence, those fields surface as `confidence`, `evidence_count`, `last_verified_at`.
154
+
155
+ ---
156
+
157
+ ## 🔌 Harnesses
158
+
159
+ | Harness | Recipe | Tested-on |
160
+ |---|---|---|
161
+ | Claude Code | `docs/harnesses/claude-code.md` | claude-code v1.0.0 |
162
+ | Codex | `docs/harnesses/codex.md` | codex v0.5.0 |
163
+ | Cursor | `docs/harnesses/cursor.md` | cursor v1.2.0 |
164
+ | Windsurf | `docs/harnesses/windsurf.md` | windsurf v1.0 |
165
+ | Gemini CLI | `docs/harnesses/gemini-cli.md` | gemini-cli v0.4.0 |
166
+ | Opencode | `docs/harnesses/opencode.md` | opencode v1.18.0 |
167
+
168
+ Each recipe is a tested JSON/TOML block (parsed by `tests/unit/docs_config_lint.test.ts`), verification command, troubleshooting and uninstall note. Demo: `docs/demo-cross-harness.md` (10-min `▶` script: opencode `save` → Claude Code `recall`).
169
+
170
+ ---
171
+
172
+ ## ⚙️ Architecture
173
+
174
+ ```
175
+ plugin (opencode) ─┐
176
+ ├─► kevin.db (WAL, busy_timeout=5000) ◄─ kevin-mcp (stdio, SDK 1.30.0)
177
+ MCP host (any) ────┘ │ ▲ │
178
+ │ └─ kevin_audit mcp block ─┘
179
+ └── perf_samples (mcp.read/write)
180
+ ```
181
+
182
+ - **Zero network** — forbidden list enforced: `node:http/https/net/dgram, fetch, XMLHttpRequest, SSETransport, HttpTransport, child_process/spawn`; only `node:fs/path/os/sqlite`.
183
+ - **Logs on stderr only** — `stderr ready repo=... mode=ro|rw db=...`; stdout is MCP JSON only.
184
+ - **Lifecycle** — `resolveEnv → Store(busy_timeout) → Migrate(014) → Metrics+Perf → registry`; SIGINT/SIGTERM flush metrics + perf (every 100 req or signal).
185
+
186
+ Package layout:
187
+
188
+ ```
189
+ src/server.ts lifecycle, registry, ready line, signals
190
+ src/identity.ts resolution + mismatch guard
191
+ src/tools/read.ts 7 reads + ping + provenance helper
192
+ src/tools/write.ts 3 gated writes
193
+ src/provenance.ts block builder
194
+ src/perf-mcp.ts mcp.read/write budgets wrapper
195
+ ```
196
+
197
+ ---
198
+
199
+ ## ⚙️ Configuration
200
+
201
+ Text settings via `kevin_config` (compare `=== "1"`):
202
+
203
+ | Key | Default | Purpose |
204
+ |---|---|---|
205
+ | `mcp_write_enabled` | `'0'` | Gate for MCP `save` |
206
+ | `mcp_approve_enabled` | `'0'` | Double-gate for MCP `approve`/`share` |
207
+ | `mcp_repo_override` | `''` | Override RepoIdentity (hex-16) |
208
+
209
+ Plus the 40 core/plugin keys (`C-04` since `2.0.0` → golden 43 settings: `+sources_enabled`, `+source_*×3`, `+okf_write_version`, `-import_host_memory`). `kevin_audit` block `mcp` appears only on schema `013`+; pre-013 omitted (`partial:true`). Channel split counters in `kevin_metrics` + `kevin_injections.channel`.
210
+
211
+ ---
212
+
213
+ ## ⏱️ Latency budgets
214
+
215
+ | Scope | p95 | max |
216
+ |---|---|---|
217
+ | `mcp.read` | 25 ms | 100 ms |
218
+ | `mcp.write` | 50 ms | 250 ms |
219
+
220
+ Measured on reference laptop: recall p50 ≈ 0.2ms. Persists to `perf_samples` every 100 requests or SIGINT; `bench:check` enforces.
221
+
222
+ ---
223
+
224
+ ## 🛠️ Development
225
+
226
+ ```bash
227
+ npm install -w @jmtrin/kevin-mcp
228
+ npm run build -w @jmtrin/kevin-mcp
229
+ npm run typecheck -w @jmtrin/kevin-mcp
230
+ npx vitest run packages/mcp/tests/purity_scan.test.ts
231
+ npm pack --dry-run -w @jmtrin/kevin-mcp
232
+ # boot smoke (no stdout, stderr ready):
233
+ node packages/mcp/dist/server.js --help
234
+ ```
235
+
236
+ Monorepo publish order: `core → tui → plugin → mcp` (exact `2.0.0` pin), see `docs/DISTRIBUTION.md`.
237
+
238
+ ---
239
+
240
+ ## 📄 License
241
+
242
+ MIT — see `LICENSE`. Kevin is built by [jmtrin](https://github.com/jmtrin); bug reports and PRs welcome at the [issue tracker](https://github.com/jmtrin/opencode-kevin/issues).
package/package.json CHANGED
@@ -1,37 +1,35 @@
1
1
  {
2
- "name": "@jmtrin/kevin-mcp",
3
- "version": "1.5.0",
4
- "description": "Kevin MCP — stdio bridge for any MCP harness (Bridge)",
5
- "type": "module",
6
- "bin": {
7
- "kevin-mcp": "dist/server.js"
8
- },
9
- "main": "dist/server.js",
10
- "types": "dist/server.d.ts",
11
- "exports": {
12
- ".": {
13
- "types": "./dist/server.d.ts",
14
- "import": "./dist/server.js"
15
- }
16
- },
17
- "files": [
18
- "dist"
19
- ],
20
- "scripts": {
21
- "build": "tsc -p tsconfig.json",
22
- "typecheck": "tsc --noEmit",
23
- "prepublishOnly": "npm run build"
24
- },
25
- "dependencies": {
26
- "@jmtrin/kevin-core": "1.5.0",
27
- "@modelcontextprotocol/sdk": "1.30.0",
28
- "zod": "^3.25.0"
29
- },
30
- "engines": {
31
- "node": ">=22.5.0"
32
- },
33
- "publishConfig": {
34
- "access": "public"
35
- },
36
- "license": "MIT"
2
+ "name": "@jmtrin/kevin-mcp",
3
+ "version": "2.1.0",
4
+ "description": "Kevin MCP — stdio bridge for any MCP harness (Bridge)",
5
+ "type": "module",
6
+ "bin": {
7
+ "kevin-mcp": "dist/server.js"
8
+ },
9
+ "main": "dist/server.js",
10
+ "types": "dist/server.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/server.d.ts",
14
+ "import": "./dist/server.js"
15
+ }
16
+ },
17
+ "files": ["dist"],
18
+ "scripts": {
19
+ "build": "tsc -p tsconfig.json",
20
+ "typecheck": "tsc --noEmit",
21
+ "prepublishOnly": "npm run build"
22
+ },
23
+ "dependencies": {
24
+ "@jmtrin/kevin-core": "2.1.0",
25
+ "@modelcontextprotocol/sdk": "1.30.0",
26
+ "zod": "^3.25.0"
27
+ },
28
+ "engines": {
29
+ "node": ">=22.5.0"
30
+ },
31
+ "publishConfig": {
32
+ "access": "public"
33
+ },
34
+ "license": "MIT"
37
35
  }