ctxjev-mcp 0.7.1 → 0.7.2
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/README.md +12 -7
- package/dist/schemas.d.ts +44 -0
- package/dist/schemas.js +5 -0
- package/dist/schemas.js.map +1 -1
- package/dist/server.js +4 -4
- package/dist/server.js.map +1 -1
- package/dist/tools.js +6 -3
- package/dist/tools.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -27,7 +27,7 @@ config shape differs.
|
|
|
27
27
|
|
|
28
28
|
## Setup
|
|
29
29
|
|
|
30
|
-
Every example below pins the version (`ctxjev-mcp@0.7.
|
|
30
|
+
Every example below pins the version (`ctxjev-mcp@0.7.2`, the latest on npm), so your host runs the
|
|
31
31
|
release you chose rather than whatever npm has at the time; change the pin to upgrade.
|
|
32
32
|
|
|
33
33
|
Both tools score with Jev by default (`scorer: "jev"`), which needs a key from
|
|
@@ -40,7 +40,7 @@ offline use only, leave `--env TYPESAFE_API_KEY=...` (or the `env` block) out of
|
|
|
40
40
|
**Claude Code:**
|
|
41
41
|
|
|
42
42
|
```bash
|
|
43
|
-
claude mcp add ctxjev --env TYPESAFE_API_KEY=... -- npx ctxjev-mcp@0.7.
|
|
43
|
+
claude mcp add ctxjev --env TYPESAFE_API_KEY=... -- npx ctxjev-mcp@0.7.2
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
The ctxjev repo also carries a project-level `.mcp.json`, which runs the server from
|
|
@@ -54,11 +54,11 @@ a local stdio server doesn't use, so it's safe to ignore (or `claude mcp remove
|
|
|
54
54
|
**Codex CLI** (verified against `codex-cli` v0.155.1):
|
|
55
55
|
|
|
56
56
|
```bash
|
|
57
|
-
codex mcp add ctxjev --env TYPESAFE_API_KEY=... -- npx ctxjev-mcp@0.7.
|
|
57
|
+
codex mcp add ctxjev --env TYPESAFE_API_KEY=... -- npx ctxjev-mcp@0.7.2
|
|
58
58
|
```
|
|
59
59
|
|
|
60
60
|
Or through the [Agent Plugins](https://agent-plugins.org) bundle in the ctxjev repo
|
|
61
|
-
(`.agents/plugins/marketplace.json`), which registers the same `npx ctxjev-mcp@0.7.
|
|
61
|
+
(`.agents/plugins/marketplace.json`), which registers the same `npx ctxjev-mcp@0.7.2` command:
|
|
62
62
|
|
|
63
63
|
```bash
|
|
64
64
|
codex plugin marketplace add x96x64/ctxjev
|
|
@@ -74,7 +74,7 @@ codex plugin add ctxjev@ctxjev-plugins
|
|
|
74
74
|
"ctxjev": {
|
|
75
75
|
"type": "stdio",
|
|
76
76
|
"command": "npx",
|
|
77
|
-
"args": ["ctxjev-mcp@0.7.
|
|
77
|
+
"args": ["ctxjev-mcp@0.7.2"],
|
|
78
78
|
"env": { "TYPESAFE_API_KEY": "..." }
|
|
79
79
|
}
|
|
80
80
|
}
|
|
@@ -86,11 +86,16 @@ codex plugin add ctxjev@ctxjev-plugins
|
|
|
86
86
|
- **`score_relevance`** takes `{ goal, entries, scorer?, recencyWeight? }` and returns a
|
|
87
87
|
relevance/recency/combined score per entry plus Jev token usage, with no decision made.
|
|
88
88
|
`scorer` is `"jev"` (the default, as before 0.7.1; needs `TYPESAFE_API_KEY`), `"local"`, or
|
|
89
|
-
`"recency"`; the last two run offline and report zero usage.
|
|
89
|
+
`"recency"`; the last two run offline and report zero usage. Under `"local"`, relevance is the
|
|
90
|
+
keyword overlap ranked within the batch, the same scale `prune_history`'s thresholds use (0.7.1
|
|
91
|
+
returned the raw overlap here); when every entry overlaps equally, it's the overlap itself, marked
|
|
92
|
+
`tied`.
|
|
90
93
|
- **`prune_history`** takes the same input plus `{ dropBelow?, summarizeBelow? }` and returns a
|
|
91
94
|
decision (`keep`/`drop`/`summarize`) per entry, a savings report, and Jev token usage.
|
|
92
95
|
|
|
93
|
-
`entries` is `{ id, role: 'user'|'assistant'|'tool', toolName?, content, timestamp }[]`.
|
|
96
|
+
`entries` is `{ id, role: 'user'|'assistant'|'tool', toolName?, content, timestamp }[]`. An
|
|
97
|
+
argument a tool doesn't take (a misspelt `recencyweight`, a `policy` object) is an error rather than
|
|
98
|
+
ignored.
|
|
94
99
|
|
|
95
100
|
With `scorer: "jev"`, entry content and the goal are sent to TypeSafe AI's Jev API (with `"local"`
|
|
96
101
|
or `"recency"`, nothing is sent anywhere). Common secret formats (API keys,
|
package/dist/schemas.d.ts
CHANGED
|
@@ -57,6 +57,50 @@ export declare const pruneHistoryInput: {
|
|
|
57
57
|
}, z.core.$strip>>;
|
|
58
58
|
recencyWeight: z.ZodOptional<z.ZodNumber>;
|
|
59
59
|
};
|
|
60
|
+
export declare const scoreRelevanceSchema: z.ZodObject<{
|
|
61
|
+
scorer: z.ZodDefault<z.ZodEnum<{
|
|
62
|
+
jev: "jev";
|
|
63
|
+
local: "local";
|
|
64
|
+
recency: "recency";
|
|
65
|
+
}>>;
|
|
66
|
+
goal: z.ZodString;
|
|
67
|
+
entries: z.ZodArray<z.ZodObject<{
|
|
68
|
+
id: z.ZodString;
|
|
69
|
+
role: z.ZodEnum<{
|
|
70
|
+
user: "user";
|
|
71
|
+
assistant: "assistant";
|
|
72
|
+
tool: "tool";
|
|
73
|
+
}>;
|
|
74
|
+
toolName: z.ZodOptional<z.ZodString>;
|
|
75
|
+
content: z.ZodString;
|
|
76
|
+
timestamp: z.ZodNumber;
|
|
77
|
+
sourceTokens: z.ZodOptional<z.ZodNumber>;
|
|
78
|
+
}, z.core.$strip>>;
|
|
79
|
+
recencyWeight: z.ZodOptional<z.ZodNumber>;
|
|
80
|
+
}, z.core.$strict>;
|
|
81
|
+
export declare const pruneHistorySchema: z.ZodObject<{
|
|
82
|
+
dropBelow: z.ZodOptional<z.ZodNumber>;
|
|
83
|
+
summarizeBelow: z.ZodOptional<z.ZodNumber>;
|
|
84
|
+
scorer: z.ZodDefault<z.ZodEnum<{
|
|
85
|
+
jev: "jev";
|
|
86
|
+
local: "local";
|
|
87
|
+
recency: "recency";
|
|
88
|
+
}>>;
|
|
89
|
+
goal: z.ZodString;
|
|
90
|
+
entries: z.ZodArray<z.ZodObject<{
|
|
91
|
+
id: z.ZodString;
|
|
92
|
+
role: z.ZodEnum<{
|
|
93
|
+
user: "user";
|
|
94
|
+
assistant: "assistant";
|
|
95
|
+
tool: "tool";
|
|
96
|
+
}>;
|
|
97
|
+
toolName: z.ZodOptional<z.ZodString>;
|
|
98
|
+
content: z.ZodString;
|
|
99
|
+
timestamp: z.ZodNumber;
|
|
100
|
+
sourceTokens: z.ZodOptional<z.ZodNumber>;
|
|
101
|
+
}, z.core.$strip>>;
|
|
102
|
+
recencyWeight: z.ZodOptional<z.ZodNumber>;
|
|
103
|
+
}, z.core.$strict>;
|
|
60
104
|
/** dropBelow/summarizeBelow are each in range on their own, but nothing above stops a reversed
|
|
61
105
|
* pair from making 'summarize' unreachable — check the actual values a call resolves to
|
|
62
106
|
* (including the defaults) before running it. The invariant itself lives in ctxjev-core; this
|
package/dist/schemas.js
CHANGED
|
@@ -55,6 +55,11 @@ export const pruneHistoryInput = {
|
|
|
55
55
|
.optional()
|
|
56
56
|
.describe(`Combined-score floor below which an entry is marked summarize (worth shortening) rather than keep. Defaults to ${DEFAULT_POLICY.summarizeBelow}.`),
|
|
57
57
|
};
|
|
58
|
+
// What the server registers: an argument the tool doesn't take (`policy`, a misspelt
|
|
59
|
+
// `recencyweight`) is an error, not dropped in silence, which ran the call on the defaults the caller
|
|
60
|
+
// meant to change (the fifth audit). An entry may still carry fields of its own: they aren't arguments.
|
|
61
|
+
export const scoreRelevanceSchema = z.strictObject(scoreRelevanceInput);
|
|
62
|
+
export const pruneHistorySchema = z.strictObject(pruneHistoryInput);
|
|
58
63
|
/** dropBelow/summarizeBelow are each in range on their own, but nothing above stops a reversed
|
|
59
64
|
* pair from making 'summarize' unreachable — check the actual values a call resolves to
|
|
60
65
|
* (including the defaults) before running it. The invariant itself lives in ctxjev-core; this
|
package/dist/schemas.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
|
@@ -2,7 +2,7 @@ import { readFileSync } from 'node:fs';
|
|
|
2
2
|
import { dirname, join } from 'node:path';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
4
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
5
|
-
import {
|
|
5
|
+
import { pruneHistorySchema, scoreRelevanceSchema } from './schemas.js';
|
|
6
6
|
import { pruneHistoryTool, scoreRelevanceTool } from './tools.js';
|
|
7
7
|
// Read from this package's own package.json rather than a hardcoded constant, so the version
|
|
8
8
|
// reported to MCP clients can't silently go stale after the next release the way a literal
|
|
@@ -23,8 +23,8 @@ const needsMissingKey = (scorer) => scorer === 'jev' && !process.env.TYPESAFE_AP
|
|
|
23
23
|
export function createServer() {
|
|
24
24
|
const server = new McpServer({ name: 'ctxjev', version: VERSION });
|
|
25
25
|
server.registerTool('score_relevance', {
|
|
26
|
-
description: "Score a batch of AI agent history entries for relevance to a goal: with Jev by default (needs TYPESAFE_API_KEY), or offline with scorer 'local' or 'recency'. Doesn't decide what to do about it — see prune_history for that.",
|
|
27
|
-
inputSchema:
|
|
26
|
+
description: "Score a batch of AI agent history entries for relevance to a goal: with Jev by default (needs TYPESAFE_API_KEY), or offline with scorer 'local' or 'recency'. Under 'local', relevance is keyword overlap ranked within the batch (0 lowest, 1 highest; `tied` when every entry overlaps equally), the scale prune_history's thresholds use. Doesn't decide what to do about it — see prune_history for that.",
|
|
27
|
+
inputSchema: scoreRelevanceSchema,
|
|
28
28
|
}, async (args) => {
|
|
29
29
|
if (needsMissingKey(args.scorer))
|
|
30
30
|
return MISSING_KEY;
|
|
@@ -33,7 +33,7 @@ export function createServer() {
|
|
|
33
33
|
});
|
|
34
34
|
server.registerTool('prune_history', {
|
|
35
35
|
description: "Score a batch of AI agent history entries against a goal and decide what to keep, drop, or summarize: with Jev by default (needs TYPESAFE_API_KEY), or offline with scorer 'local' or 'recency'.",
|
|
36
|
-
inputSchema:
|
|
36
|
+
inputSchema: pruneHistorySchema,
|
|
37
37
|
}, async (args) => {
|
|
38
38
|
if (needsMissingKey(args.scorer))
|
|
39
39
|
return MISSING_KEY;
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AACvE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEjE,6FAA6F;AAC7F,2FAA2F;AAC3F,oFAAoF;AACpF,MAAM,OAAO,GAAW,IAAI,CAAC,KAAK,CAChC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC,CACvF,CAAC,OAAO,CAAA;AAET,MAAM,WAAW,GAAG;IAClB,OAAO,EAAE,IAAI;IACb,OAAO,EAAE;QACP;YACE,IAAI,EAAE,MAAe;YACrB,IAAI,EAAE,oTAAoT;SAC3T;KACF;CACF,CAAA;AAED,mGAAmG;AACnG,6EAA6E;AAC7E,MAAM,eAAe,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAA;AAE7F,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;IAElE,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,WAAW,EACT,+YAA+Y;QACjZ,WAAW,EAAE,oBAAoB;KAClC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,OAAO,WAAW,CAAA;QACpD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAA;QAC7C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;IAC/E,CAAC,CACF,CAAA;IAED,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,WAAW,EAAE,kMAAkM;QAC/M,WAAW,EAAE,kBAAkB;KAChC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,OAAO,WAAW,CAAA;QACpD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAA;QAC3C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;IAC/E,CAAC,CACF,CAAA;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
|
package/dist/tools.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DEFAULT_POLICY, createUsageAccumulator, pruneContext, scoreEntries, summarizeSavings } from 'ctxjev-core';
|
|
1
|
+
import { DEFAULT_POLICY, createUsageAccumulator, pruneContext, rankLocalRelevance, scoreEntries, summarizeSavings } from 'ctxjev-core';
|
|
2
2
|
import { validatePolicyOrdering } from './schemas.js';
|
|
3
3
|
/**
|
|
4
4
|
* Plain functions wrapping ctxjev-core, kept independent of the MCP framework so they're
|
|
@@ -35,8 +35,11 @@ export async function scoreRelevanceTool({ scorer = 'jev', goal, entries, recenc
|
|
|
35
35
|
// core's own default scorer is 'recency' as of 0.6.0 (see prune.ts), since the holdout eval tied
|
|
36
36
|
// Jev on task success. These tools default to 'jev', as they did before `scorer` existed, so a
|
|
37
37
|
// host's existing calls keep their meaning; 'local' and 'recency' are offline.
|
|
38
|
-
const
|
|
39
|
-
|
|
38
|
+
const weight = recencyWeight ?? DEFAULT_POLICY.recencyWeight;
|
|
39
|
+
const scored = await scoreEntries(entries, goal, weight, { onUsage, cache, jevClient, scorer });
|
|
40
|
+
// 'local' on the scale prune_history (pruneContext) acts on: overlap ranked within the batch, so an
|
|
41
|
+
// entry scores the same in both tools. 0.7.1 returned the raw overlap here (the fifth audit).
|
|
42
|
+
return { scored: scorer === 'local' ? rankLocalRelevance(scored, weight) : scored, usage };
|
|
40
43
|
}
|
|
41
44
|
export async function pruneHistoryTool({ scorer = 'jev', goal, entries, recencyWeight, dropBelow, summarizeBelow }, { jevClient, cache = scoreCache } = {}) {
|
|
42
45
|
const policy = {
|
package/dist/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAmE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,gBAAgB,EAAmE,MAAM,aAAa,CAAA;AACvM,OAAO,EAAE,sBAAsB,EAAkB,MAAM,cAAc,CAAA;AAErE;;;GAGG;AAEH,6FAA6F;AAC7F,+FAA+F;AAC/F,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAA;AAEtC,MAAM,UAAU,uBAAuB,CAAC,KAAK,GAAG,iBAAiB;IAC/D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAA;IACvC,OAAO;QACL,GAAG,CAAC,GAAG;YACL,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAC5B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBACjB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YACvB,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC;QACD,GAAG,CAAC,GAAG,EAAE,KAAK;YACZ,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACjB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YACrB,IAAI,KAAK,CAAC,IAAI,GAAG,KAAK;gBAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC,CAAA;QAClE,CAAC;QACD,IAAI,IAAI;YACN,OAAO,KAAK,CAAC,IAAI,CAAA;QACnB,CAAC;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,GAAG,uBAAuB,EAAE,CAAA;AAa5C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAsB,EAAE,EAAE,SAAS,EAAE,KAAK,GAAG,UAAU,KAAe,EAAE;IAC7J,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,sBAAsB,EAAE,CAAA;IACnD,iGAAiG;IACjG,+FAA+F;IAC/F,+EAA+E;IAC/E,MAAM,MAAM,GAAG,aAAa,IAAI,cAAc,CAAC,aAAa,CAAA;IAC5D,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAA;IAC/F,oGAAoG;IACpG,8FAA8F;IAC9F,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAA;AAC5F,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,cAAc,EAAoB,EAAE,EAAE,SAAS,EAAE,KAAK,GAAG,UAAU,KAAe,EAAE;IACpL,MAAM,MAAM,GAAkB;QAC5B,SAAS,EAAE,SAAS,IAAI,cAAc,CAAC,SAAS;QAChD,cAAc,EAAE,cAAc,IAAI,cAAc,CAAC,cAAc;QAC/D,aAAa,EAAE,aAAa,IAAI,cAAc,CAAC,aAAa;KAC7D,CAAA;IACD,sBAAsB,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,CAAA;IAE/D,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,sBAAsB,EAAE,CAAA;IACnD,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAA;IAClG,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IACpD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;AACtC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ctxjev-mcp",
|
|
3
|
-
"version": "0.7.
|
|
4
|
-
"description": "MCP server exposing ctxjev's
|
|
3
|
+
"version": "0.7.2",
|
|
4
|
+
"description": "MCP server exposing ctxjev's context scoring/pruning as tools for any MCP-capable agent host: offline (scorer local or recency) or with Jev.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|
|
7
7
|
"model-context-protocol",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
42
42
|
"zod": "^4.6.5",
|
|
43
|
-
"ctxjev-core": "0.7.
|
|
43
|
+
"ctxjev-core": "0.7.2"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@types/node": "^22",
|