@jkudish/jev-mcp 0.1.0 → 0.3.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.
- package/CHANGELOG.md +12 -0
- package/README.md +27 -3
- package/dist/index.js +12 -17
- package/dist/index.js.map +1 -1
- package/dist/provider.d.ts +11 -0
- package/dist/provider.js +160 -0
- package/dist/provider.js.map +1 -0
- package/package.json +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.3.0
|
|
4
|
+
|
|
5
|
+
- Cloudflare Workers AI support: with `CLOUDFLARE_API_TOKEN` (or `JEV_CLOUDFLARE_API_TOKEN`) and `CLOUDFLARE_ACCOUNT_ID` set, judgments run through Cloudflare at the `typesafe/jev` alias; `JEV_PROVIDER=cloudflare` forces it. Usage tokens are reported on every call.
|
|
6
|
+
- Vercel AI Gateway support: with `AI_GATEWAY_API_KEY` set, judgments run through the AI SDK evaluate API at `typesafe-ai/jev`; `JEV_PROVIDER=vercel` forces it. Noul, choice, and score answers are adapted back to this package's shapes, with TypeSafe confidence included.
|
|
7
|
+
- Provider resolution order: TypeSafe direct, OpenRouter, Cloudflare, Vercel.
|
|
8
|
+
- Internal fix: transport branches are explicitly guarded per provider.
|
|
9
|
+
|
|
10
|
+
## 0.2.0
|
|
11
|
+
|
|
12
|
+
- OpenRouter support: with only an `OPENROUTER_API_KEY`, all judgments route through OpenRouter's Decisions API (alpha) at the same pricing; `JEV_PROVIDER` forces `typesafe` or `openrouter`. `jev-latest` maps to `typesafe/jev-1.13` there.
|
|
13
|
+
- Results now report the transport used (`provider`, resolved `model`).
|
|
14
|
+
|
|
3
15
|
## 0.1.0
|
|
4
16
|
|
|
5
17
|
Initial release, published to npm as `@jkudish/jev-mcp` (the unscoped `jev-mcp` name belongs to another project).
|
package/README.md
CHANGED
|
@@ -194,9 +194,33 @@ Jev is TypeSafe's System One model: it returns typed answers with calibrated pro
|
|
|
194
194
|
|
|
195
195
|
| Env var | Default | Purpose |
|
|
196
196
|
| --- | --- | --- |
|
|
197
|
-
| `TYPESAFE_API_KEY` | none |
|
|
198
|
-
| `
|
|
199
|
-
| `
|
|
197
|
+
| `TYPESAFE_API_KEY` | none | TypeSafe direct. Default provider when set. |
|
|
198
|
+
| `OPENROUTER_API_KEY` | none | OpenRouter `sk-or-` key; used when `TYPESAFE_API_KEY` is absent. |
|
|
199
|
+
| `CLOUDFLARE_API_TOKEN` + `CLOUDFLARE_ACCOUNT_ID` | none | Cloudflare Workers AI; used when no other provider key is present. `JEV_CLOUDFLARE_API_TOKEN` is honored first for separate credentials. |
|
|
200
|
+
| `AI_GATEWAY_API_KEY` | none | Vercel AI Gateway; used when no other provider key is present. |
|
|
201
|
+
| `JEV_PROVIDER` | `auto` | Force `typesafe`, `openrouter`, `cloudflare`, or `vercel` instead of auto-detection. |
|
|
202
|
+
| `JEV_MCP_MODEL` | `jev-latest` | Pin a Jev version, e.g. `jev-1.12`, or `typesafe/jev-1.13` on OpenRouter. |
|
|
203
|
+
| `TYPESAFE_BASE_URL` | none | Custom direct endpoint (origin only; the SDK appends its route). |
|
|
204
|
+
|
|
205
|
+
### Vercel
|
|
206
|
+
|
|
207
|
+
With `AI_GATEWAY_API_KEY` set, judgments run through the Vercel AI Gateway at `typesafe-ai/jev`, using the AI SDK's evaluate API. Answers are adapted back to this package's shapes, including TypeSafe's confidence statistic. Gateway calls appear in Vercel logs and budgets.
|
|
208
|
+
|
|
209
|
+
### Cloudflare
|
|
210
|
+
|
|
211
|
+
With `CLOUDFLARE_API_TOKEN` and `CLOUDFLARE_ACCOUNT_ID` set (and no other provider key), judgments run through Cloudflare Workers AI at `typesafe/jev`, the single always-current alias. Usage tokens come back on every call. Cloudflare serves one alias rather than pinned versions, and pricing is listed in the Cloudflare dashboard. Direct TypeSafe remains the recommended default when you have several keys.
|
|
212
|
+
|
|
213
|
+
### OpenRouter
|
|
214
|
+
|
|
215
|
+
If you already have an OpenRouter key, that is all you need: with no `TYPESAFE_API_KEY` present, every call goes through OpenRouter's Decisions API at identical pricing. The endpoint is alpha and adds a hop, and OpenRouter serves pinned versions rather than a `latest` alias, so the default `jev-latest` maps to `typesafe/jev-1.13` there. Direct TypeSafe remains the recommended default when you have both keys.
|
|
216
|
+
|
|
217
|
+
## Also in the family
|
|
218
|
+
|
|
219
|
+
Need those judgments to drive a real browser? [Jev Browser](https://github.com/jkudish/jev-browser) gives an agent a task and a URL and lets Jev pick the actions: click, type, select, stop. It uses the same judgment style this server exposes. The npm package is [@jkudish/jev-browser](https://www.npmjs.com/package/@jkudish/jev-browser).
|
|
220
|
+
|
|
221
|
+
## Sponsoring
|
|
222
|
+
|
|
223
|
+
If you find Jev MCP useful, consider becoming a [sponsor](https://github.com/sponsors/jkudish) or [donating](https://stripe.com/@jkudish).
|
|
200
224
|
|
|
201
225
|
## Development
|
|
202
226
|
|
package/dist/index.js
CHANGED
|
@@ -9,22 +9,14 @@
|
|
|
9
9
|
// jev_find — semantic search over candidates, no embeddings required
|
|
10
10
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
11
11
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
12
|
-
import { choice, noul
|
|
12
|
+
import { choice, noul } from "@typesafe-ai/sdk";
|
|
13
13
|
import { z } from "zod";
|
|
14
14
|
import { ensureUniqueIds, existsVerdict, MAX_CANDIDATES, MAX_CANDIDATE_CHARS, rankCandidates, RELATION_TO_VERDICT, screenRecommendation, truncate, verifyAction, } from "./lib.js";
|
|
15
15
|
const MODEL = process.env.JEV_MCP_MODEL ?? "jev-latest";
|
|
16
16
|
const server = new McpServer({ name: "jev-mcp", version: "0.1.0" });
|
|
17
|
-
|
|
18
|
-
const client = new TypeSafeClient(process.env.TYPESAFE_BASE_URL ? { baseURL: process.env.TYPESAFE_BASE_URL } : undefined);
|
|
17
|
+
import { askJev as askProvider } from "./provider.js";
|
|
19
18
|
async function askJev(state, questions) {
|
|
20
|
-
|
|
21
|
-
return {
|
|
22
|
-
answers: response.answers,
|
|
23
|
-
usage: {
|
|
24
|
-
input_tokens: response.usage?.input_tokens ?? 0,
|
|
25
|
-
output_tokens: response.usage?.output_tokens ?? 0,
|
|
26
|
-
},
|
|
27
|
-
};
|
|
19
|
+
return askProvider(state, questions, MODEL);
|
|
28
20
|
}
|
|
29
21
|
const text = (payload) => ({
|
|
30
22
|
content: [{ type: "text", text: JSON.stringify(payload, null, 2) }],
|
|
@@ -100,7 +92,7 @@ server.registerTool("jev_verify", {
|
|
|
100
92
|
claims: claimItems,
|
|
101
93
|
evidence,
|
|
102
94
|
};
|
|
103
|
-
const { answers, usage } = await askJev(state, questions);
|
|
95
|
+
const { answers, usage, provider, model } = await askJev(state, questions);
|
|
104
96
|
const results = claimItems.map((claim) => {
|
|
105
97
|
const relation = answers[`relation_${claim.id}`];
|
|
106
98
|
const source = answers[`source_${claim.id}`];
|
|
@@ -118,7 +110,8 @@ server.registerTool("jev_verify", {
|
|
|
118
110
|
});
|
|
119
111
|
return text({
|
|
120
112
|
tool: "jev_verify",
|
|
121
|
-
model:
|
|
113
|
+
model: model,
|
|
114
|
+
provider,
|
|
122
115
|
auto_accept: autoAccept,
|
|
123
116
|
summary: {
|
|
124
117
|
verified: results.filter((r) => r.verdict === "verified").length,
|
|
@@ -168,14 +161,15 @@ server.registerTool("jev_screen", {
|
|
|
168
161
|
});
|
|
169
162
|
}
|
|
170
163
|
const state = { content, purpose: purpose ?? null };
|
|
171
|
-
const { answers, usage } = await askJev(state, questions);
|
|
164
|
+
const { answers, usage, provider, model } = await askJev(state, questions);
|
|
172
165
|
const injection = answers.injection?.noul ?? 0;
|
|
173
166
|
const substance = answers.substance?.noul ?? undefined;
|
|
174
167
|
const relevance = purpose ? (answers.relevance?.noul ?? undefined) : undefined;
|
|
175
168
|
const recommendation = screenRecommendation({ injection, relevance, substance, blockAt, reviewAt });
|
|
176
169
|
return text({
|
|
177
170
|
tool: "jev_screen",
|
|
178
|
-
model:
|
|
171
|
+
model: model,
|
|
172
|
+
provider,
|
|
179
173
|
probabilities: { injection, substance, relevance: relevance ?? null },
|
|
180
174
|
thresholds: { block_at: blockAt, review_at: reviewAt },
|
|
181
175
|
recommendation,
|
|
@@ -209,13 +203,14 @@ server.registerTool("jev_find", {
|
|
|
209
203
|
}),
|
|
210
204
|
};
|
|
211
205
|
const state = { query, candidates };
|
|
212
|
-
const { answers, usage } = await askJev(state, questions);
|
|
206
|
+
const { answers, usage, provider, model } = await askJev(state, questions);
|
|
213
207
|
const probabilities = answers.best?.probabilities ?? {};
|
|
214
208
|
const ranked = rankCandidates(candidates, probabilities).slice(0, topK);
|
|
215
209
|
const exists = answers.exists?.noul ?? 0;
|
|
216
210
|
return text({
|
|
217
211
|
tool: "jev_find",
|
|
218
|
-
model:
|
|
212
|
+
model: model,
|
|
213
|
+
provider,
|
|
219
214
|
query,
|
|
220
215
|
exists,
|
|
221
216
|
exists_verdict: existsVerdict(exists),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,+CAA+C;AAC/C,EAAE;AACF,4EAA4E;AAC5E,sEAAsE;AACtE,EAAE;AACF,wEAAwE;AACxE,0EAA0E;AAC1E,yEAAyE;AAEzE,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type JevProvider = "typesafe" | "openrouter" | "cloudflare" | "vercel";
|
|
2
|
+
export interface AskResult {
|
|
3
|
+
answers: Record<string, any>;
|
|
4
|
+
usage: {
|
|
5
|
+
input_tokens: number;
|
|
6
|
+
output_tokens: number;
|
|
7
|
+
};
|
|
8
|
+
provider: JevProvider;
|
|
9
|
+
model: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function askJev(state: unknown, questions: Record<string, unknown>, model: string, signal?: AbortSignal): Promise<AskResult>;
|
package/dist/provider.js
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
// Jev transport: TypeSafe direct (default), OpenRouter Decisions, or
|
|
2
|
+
// Cloudflare Workers AI. All speak the {state, questions} / answers contract;
|
|
3
|
+
// URL, auth, and model slugs differ. Proxies add hops, so direct TypeSafe
|
|
4
|
+
// remains the recommended default.
|
|
5
|
+
import { experimental_evaluate } from "ai";
|
|
6
|
+
import { TypeSafeClient } from "@typesafe-ai/sdk";
|
|
7
|
+
const X_TITLE = "jev-mcp";
|
|
8
|
+
const REFERER = "https://github.com/jkudish/jev-mcp";
|
|
9
|
+
let typesafeClient = null;
|
|
10
|
+
function resolve(env) {
|
|
11
|
+
const explicit = (env.JEV_PROVIDER ?? "auto").toLowerCase();
|
|
12
|
+
const hasTypesafe = Boolean(env.TYPESAFE_API_KEY);
|
|
13
|
+
const hasOpenRouter = /^sk-or-/.test(env.OPENROUTER_API_KEY ?? "");
|
|
14
|
+
const cfToken = env.JEV_CLOUDFLARE_API_TOKEN || env.CLOUDFLARE_API_TOKEN;
|
|
15
|
+
const hasCloudflare = Boolean(cfToken && env.CLOUDFLARE_ACCOUNT_ID);
|
|
16
|
+
if (explicit === "typesafe") {
|
|
17
|
+
if (!hasTypesafe)
|
|
18
|
+
throw new Error("JEV_PROVIDER=typesafe but TYPESAFE_API_KEY is not set.");
|
|
19
|
+
return "typesafe";
|
|
20
|
+
}
|
|
21
|
+
if (explicit === "openrouter") {
|
|
22
|
+
if (!hasOpenRouter)
|
|
23
|
+
throw new Error("JEV_PROVIDER=openrouter but OPENROUTER_API_KEY is not set or not an sk-or- key.");
|
|
24
|
+
return "openrouter";
|
|
25
|
+
}
|
|
26
|
+
if (explicit === "vercel") {
|
|
27
|
+
if (!env.AI_GATEWAY_API_KEY)
|
|
28
|
+
throw new Error("JEV_PROVIDER=vercel but AI_GATEWAY_API_KEY is not set.");
|
|
29
|
+
return "vercel";
|
|
30
|
+
}
|
|
31
|
+
if (explicit === "cloudflare") {
|
|
32
|
+
if (!hasCloudflare)
|
|
33
|
+
throw new Error("JEV_PROVIDER=cloudflare but a Cloudflare API token (CLOUDFLARE_API_TOKEN or JEV_CLOUDFLARE_API_TOKEN) and CLOUDFLARE_ACCOUNT_ID are not both set.");
|
|
34
|
+
return "cloudflare";
|
|
35
|
+
}
|
|
36
|
+
if (hasTypesafe)
|
|
37
|
+
return "typesafe";
|
|
38
|
+
if (hasOpenRouter)
|
|
39
|
+
return "openrouter";
|
|
40
|
+
if (hasCloudflare)
|
|
41
|
+
return "cloudflare";
|
|
42
|
+
if (env.AI_GATEWAY_API_KEY)
|
|
43
|
+
return "vercel";
|
|
44
|
+
throw new Error("No TYPESAFE_API_KEY, OPENROUTER_API_KEY (sk-or-), or Cloudflare token + CLOUDFLARE_ACCOUNT_ID found. Set one, or JEV_PROVIDER to choose explicitly.");
|
|
45
|
+
}
|
|
46
|
+
export async function askJev(state, questions, model, signal) {
|
|
47
|
+
const provider = resolve(process.env);
|
|
48
|
+
if (provider === "typesafe") {
|
|
49
|
+
typesafeClient ??= new TypeSafeClient(process.env.TYPESAFE_BASE_URL ? { baseURL: process.env.TYPESAFE_BASE_URL } : undefined);
|
|
50
|
+
const response = await typesafeClient.systemOne({ state, questions, model }, { signal });
|
|
51
|
+
return {
|
|
52
|
+
answers: response.answers,
|
|
53
|
+
usage: { input_tokens: response.usage?.input_tokens ?? 0, output_tokens: response.usage?.output_tokens ?? 0 },
|
|
54
|
+
provider,
|
|
55
|
+
model,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
if (provider === "openrouter") {
|
|
59
|
+
// OpenRouter has no redirecting "latest" slug; map it to the current
|
|
60
|
+
// release. Pin exact versions with the model env var when that matters.
|
|
61
|
+
const OPENROUTER_LATEST = "jev-1.13";
|
|
62
|
+
const effective = model === "jev-latest" ? OPENROUTER_LATEST : model;
|
|
63
|
+
const slug = effective.startsWith("typesafe/") ? effective : `typesafe/${effective}`;
|
|
64
|
+
const response = await fetch("https://openrouter.ai/api/alpha/decisions", {
|
|
65
|
+
method: "POST",
|
|
66
|
+
headers: {
|
|
67
|
+
Authorization: `Bearer ${process.env.OPENROUTER_API_KEY}`,
|
|
68
|
+
"Content-Type": "application/json",
|
|
69
|
+
"HTTP-Referer": REFERER,
|
|
70
|
+
"X-Title": X_TITLE,
|
|
71
|
+
"X-OpenRouter-Title": X_TITLE,
|
|
72
|
+
},
|
|
73
|
+
body: JSON.stringify({ model: slug, state, questions }),
|
|
74
|
+
signal,
|
|
75
|
+
});
|
|
76
|
+
if (!response.ok) {
|
|
77
|
+
const body = await response.text().catch(() => "");
|
|
78
|
+
throw new Error(`OpenRouter decisions API ${response.status}: ${body.slice(0, 200)}`);
|
|
79
|
+
}
|
|
80
|
+
const body = await response.json();
|
|
81
|
+
return {
|
|
82
|
+
answers: body.answers ?? {},
|
|
83
|
+
// The decisions endpoint does not document a usage block; tolerate absence.
|
|
84
|
+
usage: { input_tokens: body.usage?.input_tokens ?? 0, output_tokens: body.usage?.output_tokens ?? 0 },
|
|
85
|
+
provider,
|
|
86
|
+
model: slug,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
if (provider === "vercel") {
|
|
90
|
+
// Vercel AI Gateway exposes Jev through the AI SDK's experimental evaluate
|
|
91
|
+
// API: "noul" questions become "boolean", answers return as probabilities,
|
|
92
|
+
// and Choice/Score confidence lives in providerMetadata.typesafe.
|
|
93
|
+
const vercelQuestions = {};
|
|
94
|
+
for (const [id, question] of Object.entries(questions)) {
|
|
95
|
+
const q = question;
|
|
96
|
+
vercelQuestions[id] = {
|
|
97
|
+
type: q.type === "noul" ? "boolean" : q.type,
|
|
98
|
+
instructions: q.instructions,
|
|
99
|
+
criteria: q.criteria,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const result = await experimental_evaluate({
|
|
103
|
+
model: model.startsWith("typesafe-ai/") ? model : "typesafe-ai/jev",
|
|
104
|
+
state: state,
|
|
105
|
+
questions: vercelQuestions,
|
|
106
|
+
abortSignal: signal,
|
|
107
|
+
});
|
|
108
|
+
const confidence = (result.providerMetadata?.typesafe?.confidence ?? {});
|
|
109
|
+
const adapted = {};
|
|
110
|
+
for (const [id, answer] of Object.entries(result.answers)) {
|
|
111
|
+
if (answer?.type === "boolean") {
|
|
112
|
+
adapted[id] = { type: "noul", noul: answer.probability };
|
|
113
|
+
}
|
|
114
|
+
else if (answer?.type === "choice") {
|
|
115
|
+
adapted[id] = { type: "choice", choice: answer.choice, probabilities: answer.probabilities ?? {}, confidence: confidence[id] ?? null };
|
|
116
|
+
}
|
|
117
|
+
else if (answer?.type === "score") {
|
|
118
|
+
adapted[id] = { type: "score", score: answer.score, probabilities: answer.probabilities ?? {}, confidence: confidence[id] ?? null };
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
adapted[id] = answer;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
answers: adapted,
|
|
126
|
+
usage: { input_tokens: result.usage?.inputTokens ?? 0, output_tokens: result.usage?.outputTokens ?? 0 },
|
|
127
|
+
provider,
|
|
128
|
+
model: "typesafe-ai/jev",
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
// Cloudflare Workers AI wraps the same contract in {model, input} and the
|
|
132
|
+
// v4 {result, success} envelope. Single alias; no version pinning.
|
|
133
|
+
const cfSlug = model.startsWith("typesafe/") ? model : `typesafe/${model === "jev-latest" ? "jev" : model}`;
|
|
134
|
+
const cfResponse = await fetch(`https://api.cloudflare.com/client/v4/accounts/${process.env.CLOUDFLARE_ACCOUNT_ID}/ai/run`, {
|
|
135
|
+
method: "POST",
|
|
136
|
+
headers: {
|
|
137
|
+
Authorization: `Bearer ${process.env.JEV_CLOUDFLARE_API_TOKEN || process.env.CLOUDFLARE_API_TOKEN}`,
|
|
138
|
+
"Content-Type": "application/json",
|
|
139
|
+
},
|
|
140
|
+
body: JSON.stringify({ model: cfSlug, input: { state, questions } }),
|
|
141
|
+
signal,
|
|
142
|
+
});
|
|
143
|
+
const cfBody = await cfResponse.json().catch(() => ({}));
|
|
144
|
+
if (!cfResponse.ok || cfBody.success === false) {
|
|
145
|
+
throw new Error(`Cloudflare AI run ${cfResponse.status}: ${JSON.stringify(cfBody.errors ?? cfBody).slice(0, 200)}`);
|
|
146
|
+
}
|
|
147
|
+
// The v4 envelope double-nests: body.result.result holds the model output.
|
|
148
|
+
const cfOuter = cfBody.result;
|
|
149
|
+
if (cfOuter && typeof cfOuter.state === "string" && cfOuter.state !== "Completed") {
|
|
150
|
+
throw new Error(`Cloudflare AI run state ${cfOuter.state}: ${JSON.stringify(cfBody.errors ?? []).slice(0, 200)}`);
|
|
151
|
+
}
|
|
152
|
+
const cfPayload = cfOuter?.result ?? cfOuter ?? cfBody;
|
|
153
|
+
return {
|
|
154
|
+
answers: cfPayload.answers ?? {},
|
|
155
|
+
usage: { input_tokens: cfPayload.usage?.input_tokens ?? 0, output_tokens: cfPayload.usage?.output_tokens ?? 0 },
|
|
156
|
+
provider,
|
|
157
|
+
model: cfPayload.model ?? cfSlug,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jkudish/jev-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "MCP server exposing TypeSafe's Jev (System One) as purpose-built judgment tools: verify claims against evidence, screen content for injection, find semantically without embeddings.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -43,7 +43,8 @@
|
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@modelcontextprotocol/sdk": "^1.17.0",
|
|
45
45
|
"@typesafe-ai/sdk": "^0.6.0",
|
|
46
|
-
"zod": "^3.25.0"
|
|
46
|
+
"zod": "^3.25.0",
|
|
47
|
+
"ai": "^7.0.105"
|
|
47
48
|
},
|
|
48
49
|
"devDependencies": {
|
|
49
50
|
"@types/node": "^22.0.0",
|