@jkudish/jev-mcp 0.1.0 → 0.2.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 +5 -0
- package/README.md +13 -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 +71 -0
- package/dist/provider.js.map +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.2.0
|
|
4
|
+
|
|
5
|
+
- 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.
|
|
6
|
+
- Results now report the transport used (`provider`, resolved `model`).
|
|
7
|
+
|
|
3
8
|
## 0.1.0
|
|
4
9
|
|
|
5
10
|
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,19 @@ 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
|
+
| `JEV_PROVIDER` | `auto` | Force `typesafe` or `openrouter` instead of auto-detection. |
|
|
200
|
+
| `JEV_MCP_MODEL` | `jev-latest` | Pin a Jev version, e.g. `jev-1.12`, or `typesafe/jev-1.13` on OpenRouter. |
|
|
201
|
+
| `TYPESAFE_BASE_URL` | none | Custom direct endpoint (origin only; the SDK appends its route). |
|
|
202
|
+
|
|
203
|
+
### OpenRouter
|
|
204
|
+
|
|
205
|
+
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.
|
|
206
|
+
|
|
207
|
+
## Also in the family
|
|
208
|
+
|
|
209
|
+
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).
|
|
200
210
|
|
|
201
211
|
## Development
|
|
202
212
|
|
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";
|
|
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,71 @@
|
|
|
1
|
+
// Jev transport: TypeSafe direct (default) or OpenRouter's Decisions API.
|
|
2
|
+
// Both speak the same {state, questions} / answers contract; only the URL,
|
|
3
|
+
// auth, and model slug differ. OpenRouter is an alpha endpoint and adds a
|
|
4
|
+
// hop, so direct TypeSafe remains the recommended default.
|
|
5
|
+
import { TypeSafeClient } from "@typesafe-ai/sdk";
|
|
6
|
+
const X_TITLE = "jev-mcp";
|
|
7
|
+
const REFERER = "https://github.com/jkudish/jev-mcp";
|
|
8
|
+
let typesafeClient = null;
|
|
9
|
+
function resolve(env) {
|
|
10
|
+
const explicit = (env.JEV_PROVIDER ?? "auto").toLowerCase();
|
|
11
|
+
const hasTypesafe = Boolean(env.TYPESAFE_API_KEY);
|
|
12
|
+
const hasOpenRouter = /^sk-or-/.test(env.OPENROUTER_API_KEY ?? "");
|
|
13
|
+
if (explicit === "typesafe") {
|
|
14
|
+
if (!hasTypesafe)
|
|
15
|
+
throw new Error("JEV_PROVIDER=typesafe but TYPESAFE_API_KEY is not set.");
|
|
16
|
+
return "typesafe";
|
|
17
|
+
}
|
|
18
|
+
if (explicit === "openrouter") {
|
|
19
|
+
if (!hasOpenRouter)
|
|
20
|
+
throw new Error("JEV_PROVIDER=openrouter but OPENROUTER_API_KEY is not set or not an sk-or- key.");
|
|
21
|
+
return "openrouter";
|
|
22
|
+
}
|
|
23
|
+
if (hasTypesafe)
|
|
24
|
+
return "typesafe";
|
|
25
|
+
if (hasOpenRouter)
|
|
26
|
+
return "openrouter";
|
|
27
|
+
throw new Error("No TYPESAFE_API_KEY or OPENROUTER_API_KEY (sk-or-) found. Set one, or JEV_PROVIDER to choose explicitly.");
|
|
28
|
+
}
|
|
29
|
+
export async function askJev(state, questions, model, signal) {
|
|
30
|
+
const provider = resolve(process.env);
|
|
31
|
+
if (provider === "typesafe") {
|
|
32
|
+
typesafeClient ??= new TypeSafeClient(process.env.TYPESAFE_BASE_URL ? { baseURL: process.env.TYPESAFE_BASE_URL } : undefined);
|
|
33
|
+
const response = await typesafeClient.systemOne({ state, questions, model }, { signal });
|
|
34
|
+
return {
|
|
35
|
+
answers: response.answers,
|
|
36
|
+
usage: { input_tokens: response.usage?.input_tokens ?? 0, output_tokens: response.usage?.output_tokens ?? 0 },
|
|
37
|
+
provider,
|
|
38
|
+
model,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
// OpenRouter has no redirecting "latest" slug; map it to the current release.
|
|
42
|
+
// Pin exact versions with the model env var when that matters.
|
|
43
|
+
const OPENROUTER_LATEST = "jev-1.13";
|
|
44
|
+
const effective = model === "jev-latest" ? OPENROUTER_LATEST : model;
|
|
45
|
+
const slug = effective.startsWith("typesafe/") ? effective : `typesafe/${effective}`;
|
|
46
|
+
const response = await fetch("https://openrouter.ai/api/alpha/decisions", {
|
|
47
|
+
method: "POST",
|
|
48
|
+
headers: {
|
|
49
|
+
Authorization: `Bearer ${process.env.OPENROUTER_API_KEY}`,
|
|
50
|
+
"Content-Type": "application/json",
|
|
51
|
+
"HTTP-Referer": REFERER,
|
|
52
|
+
"X-Title": X_TITLE,
|
|
53
|
+
"X-OpenRouter-Title": X_TITLE,
|
|
54
|
+
},
|
|
55
|
+
body: JSON.stringify({ model: slug, state, questions }),
|
|
56
|
+
signal,
|
|
57
|
+
});
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
const body = await response.text().catch(() => "");
|
|
60
|
+
throw new Error(`OpenRouter decisions API ${response.status}: ${body.slice(0, 200)}`);
|
|
61
|
+
}
|
|
62
|
+
const body = await response.json();
|
|
63
|
+
return {
|
|
64
|
+
answers: body.answers ?? {},
|
|
65
|
+
// The decisions endpoint does not document a usage block; tolerate absence.
|
|
66
|
+
usage: { input_tokens: body.usage?.input_tokens ?? 0, output_tokens: body.usage?.output_tokens ?? 0 },
|
|
67
|
+
provider,
|
|
68
|
+
model: slug,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# 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.2.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",
|