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 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.1`, the latest on npm), so your host runs the
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.1
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.1
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.1` command:
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.1"],
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
@@ -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 { pruneHistoryInput, scoreRelevanceInput } from './schemas.js';
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: scoreRelevanceInput,
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: pruneHistoryInput,
36
+ inputSchema: pruneHistorySchema,
37
37
  }, async (args) => {
38
38
  if (needsMissingKey(args.scorer))
39
39
  return MISSING_KEY;
@@ -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,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AACrE,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,gOAAgO;QAClO,WAAW,EAAE,mBAAmB;KACjC,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,iBAAiB;KAC/B,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"}
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 scored = await scoreEntries(entries, goal, recencyWeight ?? DEFAULT_POLICY.recencyWeight, { onUsage, cache, jevClient, scorer });
39
- return { scored, usage };
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":"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"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ctxjev-mcp",
3
- "version": "0.7.1",
4
- "description": "MCP server exposing ctxjev's Jev-based context scoring/pruning as tools for any MCP-capable agent host.",
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.1"
43
+ "ctxjev-core": "0.7.2"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@types/node": "^22",