ctxjev-mcp 0.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.
- package/LICENSE +21 -0
- package/README.md +24 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas.d.ts +44 -0
- package/dist/schemas.js +29 -0
- package/dist/schemas.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +22 -0
- package/dist/server.js.map +1 -0
- package/dist/tools.d.ts +19 -0
- package/dist/tools.js +32 -0
- package/dist/tools.js.map +1 -0
- package/package.json +34 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 x96x64
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# ctxjev-mcp
|
|
2
|
+
|
|
3
|
+
MCP server exposing [Jev](https://typesafe.ai)-based context scoring/pruning (`score_relevance`,
|
|
4
|
+
`prune_history`) as tools for any MCP-capable agent host — Claude Code, Codex CLI, GitHub Copilot.
|
|
5
|
+
|
|
6
|
+
**Claude Code:**
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
claude mcp add ctxjev --env TYPESAFE_API_KEY=... -- npx ctxjev-mcp
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
**Codex CLI:**
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
codex mcp add ctxjev --env TYPESAFE_API_KEY=... -- npx ctxjev-mcp
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Get a key at [console.typesafe.ai/settings/keys](https://console.typesafe.ai/settings/keys) (no
|
|
19
|
+
waitlist). Full docs, design notes, and per-host setup live in the main repo:
|
|
20
|
+
**[github.com/x96x64/ctxjev](https://github.com/x96x64/ctxjev)**.
|
|
21
|
+
|
|
22
|
+
## License
|
|
23
|
+
|
|
24
|
+
MIT
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { createServer } from './server.js';
|
|
4
|
+
async function main() {
|
|
5
|
+
if (!process.env.TYPESAFE_API_KEY) {
|
|
6
|
+
console.error('ctxjev-mcp: TYPESAFE_API_KEY is not set — get one at console.typesafe.ai/settings/keys');
|
|
7
|
+
process.exit(1);
|
|
8
|
+
}
|
|
9
|
+
const server = createServer();
|
|
10
|
+
await server.connect(new StdioServerTransport());
|
|
11
|
+
}
|
|
12
|
+
main().catch((err) => {
|
|
13
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
14
|
+
process.exit(1);
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,wFAAwF,CAAC,CAAA;QACvG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,EAAE,CAAA;IAC7B,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAA;AAClD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;IAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const entrySchema: z.ZodObject<{
|
|
3
|
+
id: z.ZodString;
|
|
4
|
+
role: z.ZodEnum<{
|
|
5
|
+
user: "user";
|
|
6
|
+
assistant: "assistant";
|
|
7
|
+
tool: "tool";
|
|
8
|
+
}>;
|
|
9
|
+
toolName: z.ZodOptional<z.ZodString>;
|
|
10
|
+
content: z.ZodString;
|
|
11
|
+
timestamp: z.ZodNumber;
|
|
12
|
+
}, z.core.$strip>;
|
|
13
|
+
export declare const scoreRelevanceInput: {
|
|
14
|
+
goal: z.ZodString;
|
|
15
|
+
entries: z.ZodArray<z.ZodObject<{
|
|
16
|
+
id: z.ZodString;
|
|
17
|
+
role: z.ZodEnum<{
|
|
18
|
+
user: "user";
|
|
19
|
+
assistant: "assistant";
|
|
20
|
+
tool: "tool";
|
|
21
|
+
}>;
|
|
22
|
+
toolName: z.ZodOptional<z.ZodString>;
|
|
23
|
+
content: z.ZodString;
|
|
24
|
+
timestamp: z.ZodNumber;
|
|
25
|
+
}, z.core.$strip>>;
|
|
26
|
+
recencyWeight: z.ZodOptional<z.ZodNumber>;
|
|
27
|
+
};
|
|
28
|
+
export declare const pruneHistoryInput: {
|
|
29
|
+
dropBelow: z.ZodOptional<z.ZodNumber>;
|
|
30
|
+
summarizeBelow: z.ZodOptional<z.ZodNumber>;
|
|
31
|
+
goal: z.ZodString;
|
|
32
|
+
entries: z.ZodArray<z.ZodObject<{
|
|
33
|
+
id: z.ZodString;
|
|
34
|
+
role: z.ZodEnum<{
|
|
35
|
+
user: "user";
|
|
36
|
+
assistant: "assistant";
|
|
37
|
+
tool: "tool";
|
|
38
|
+
}>;
|
|
39
|
+
toolName: z.ZodOptional<z.ZodString>;
|
|
40
|
+
content: z.ZodString;
|
|
41
|
+
timestamp: z.ZodNumber;
|
|
42
|
+
}, z.core.$strip>>;
|
|
43
|
+
recencyWeight: z.ZodOptional<z.ZodNumber>;
|
|
44
|
+
};
|
package/dist/schemas.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const entrySchema = z.object({
|
|
3
|
+
id: z.string(),
|
|
4
|
+
role: z.enum(['user', 'assistant', 'tool']),
|
|
5
|
+
toolName: z.string().optional(),
|
|
6
|
+
content: z.string(),
|
|
7
|
+
timestamp: z.number(),
|
|
8
|
+
});
|
|
9
|
+
export const scoreRelevanceInput = {
|
|
10
|
+
goal: z.string().describe('The current task/goal to judge each entry\'s relevance against.'),
|
|
11
|
+
entries: z.array(entrySchema).describe('The agent history entries to score.'),
|
|
12
|
+
recencyWeight: z
|
|
13
|
+
.number()
|
|
14
|
+
.min(0)
|
|
15
|
+
.max(1)
|
|
16
|
+
.optional()
|
|
17
|
+
.describe('How much an entry\'s position in the batch (recency) should factor into its score, 0-1. Defaults to 0.1.'),
|
|
18
|
+
};
|
|
19
|
+
export const pruneHistoryInput = {
|
|
20
|
+
...scoreRelevanceInput,
|
|
21
|
+
dropBelow: z.number().min(0).max(1).optional().describe('Combined-score floor below which an entry is dropped. Defaults to 0.25.'),
|
|
22
|
+
summarizeBelow: z
|
|
23
|
+
.number()
|
|
24
|
+
.min(0)
|
|
25
|
+
.max(1)
|
|
26
|
+
.optional()
|
|
27
|
+
.describe('Combined-score floor below which an entry is summarized rather than kept verbatim. Defaults to 0.6.'),
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAC3C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iEAAiE,CAAC;IAC5F,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IAC7E,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CAAC,0GAA0G,CAAC;CACxH,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,GAAG,mBAAmB;IACtB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yEAAyE,CAAC;IAClI,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CAAC,qGAAqG,CAAC;CACnH,CAAA"}
|
package/dist/server.d.ts
ADDED
package/dist/server.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { pruneHistoryInput, scoreRelevanceInput } from './schemas.js';
|
|
3
|
+
import { pruneHistoryTool, scoreRelevanceTool } from './tools.js';
|
|
4
|
+
export function createServer() {
|
|
5
|
+
const server = new McpServer({ name: 'ctxjev', version: '0.0.0' });
|
|
6
|
+
server.registerTool('score_relevance', {
|
|
7
|
+
description: "Score a batch of AI agent history entries for relevance to a goal, using Jev. Doesn't decide what to do about it — see prune_history for that.",
|
|
8
|
+
inputSchema: scoreRelevanceInput,
|
|
9
|
+
}, async (args) => {
|
|
10
|
+
const result = await scoreRelevanceTool(args);
|
|
11
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
12
|
+
});
|
|
13
|
+
server.registerTool('prune_history', {
|
|
14
|
+
description: 'Score a batch of AI agent history entries against a goal and decide what to keep, drop, or summarize.',
|
|
15
|
+
inputSchema: pruneHistoryInput,
|
|
16
|
+
}, async (args) => {
|
|
17
|
+
const result = await pruneHistoryTool(args);
|
|
18
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
19
|
+
});
|
|
20
|
+
return server;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,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,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,gJAAgJ;QAClJ,WAAW,EAAE,mBAAmB;KACjC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,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,uGAAuG;QACpH,WAAW,EAAE,iBAAiB;KAC/B,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,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.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type Entry, type JevUsage } from 'ctxjev-core';
|
|
2
|
+
export type ScoreRelevanceArgs = {
|
|
3
|
+
goal: string;
|
|
4
|
+
entries: Entry[];
|
|
5
|
+
recencyWeight?: number;
|
|
6
|
+
};
|
|
7
|
+
export declare function scoreRelevanceTool({ goal, entries, recencyWeight }: ScoreRelevanceArgs): Promise<{
|
|
8
|
+
scored: import("ctxjev-core").ScoredEntry[];
|
|
9
|
+
usage: JevUsage;
|
|
10
|
+
}>;
|
|
11
|
+
export type PruneHistoryArgs = ScoreRelevanceArgs & {
|
|
12
|
+
dropBelow?: number;
|
|
13
|
+
summarizeBelow?: number;
|
|
14
|
+
};
|
|
15
|
+
export declare function pruneHistoryTool({ goal, entries, recencyWeight, dropBelow, summarizeBelow }: PruneHistoryArgs): Promise<{
|
|
16
|
+
decisions: import("ctxjev-core").PruneDecision[];
|
|
17
|
+
savings: import("ctxjev-core").SavingsReport;
|
|
18
|
+
usage: JevUsage;
|
|
19
|
+
}>;
|
package/dist/tools.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { DEFAULT_POLICY, pruneContext, scoreEntries, summarizeSavings } from 'ctxjev-core';
|
|
2
|
+
/**
|
|
3
|
+
* Plain functions wrapping ctxjev-core, kept independent of the MCP framework so they're
|
|
4
|
+
* testable without spinning up a server. src/server.ts adapts these into MCP tool handlers.
|
|
5
|
+
*/
|
|
6
|
+
function newUsageAccumulator() {
|
|
7
|
+
const usage = { inputTokens: 0, outputTokens: 0 };
|
|
8
|
+
return {
|
|
9
|
+
usage,
|
|
10
|
+
onUsage: (u) => {
|
|
11
|
+
usage.inputTokens += u.inputTokens;
|
|
12
|
+
usage.outputTokens += u.outputTokens;
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export async function scoreRelevanceTool({ goal, entries, recencyWeight }) {
|
|
17
|
+
const { usage, onUsage } = newUsageAccumulator();
|
|
18
|
+
const scored = await scoreEntries(entries, goal, recencyWeight ?? DEFAULT_POLICY.recencyWeight, { onUsage });
|
|
19
|
+
return { scored, usage };
|
|
20
|
+
}
|
|
21
|
+
export async function pruneHistoryTool({ goal, entries, recencyWeight, dropBelow, summarizeBelow }) {
|
|
22
|
+
const policy = {
|
|
23
|
+
dropBelow: dropBelow ?? DEFAULT_POLICY.dropBelow,
|
|
24
|
+
summarizeBelow: summarizeBelow ?? DEFAULT_POLICY.summarizeBelow,
|
|
25
|
+
recencyWeight: recencyWeight ?? DEFAULT_POLICY.recencyWeight,
|
|
26
|
+
};
|
|
27
|
+
const { usage, onUsage } = newUsageAccumulator();
|
|
28
|
+
const decisions = await pruneContext(entries, goal, policy, { onUsage });
|
|
29
|
+
const savings = summarizeSavings(entries, decisions);
|
|
30
|
+
return { decisions, savings, usage };
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAiD,MAAM,aAAa,CAAA;AAEzI;;;GAGG;AAEH,SAAS,mBAAmB;IAC1B,MAAM,KAAK,GAAa,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAA;IAC3D,OAAO;QACL,KAAK;QACL,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YACb,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,WAAW,CAAA;YAClC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,YAAY,CAAA;QACtC,CAAC;KACF,CAAA;AACH,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAsB;IAC3F,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,mBAAmB,EAAE,CAAA;IAChD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,aAAa,IAAI,cAAc,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;IAC5G,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;AAC1B,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,cAAc,EAAoB;IAClH,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;IAED,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,mBAAmB,EAAE,CAAA;IAChD,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;IACxE,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
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ctxjev-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server exposing ctxjev's Jev-based context scoring/pruning as tools for any MCP-capable agent host.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/x96x64/ctxjev.git",
|
|
9
|
+
"directory": "packages/mcp-server"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/x96x64/ctxjev/tree/main/packages/mcp-server#readme",
|
|
12
|
+
"type": "module",
|
|
13
|
+
"main": "./dist/index.js",
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"bin": {
|
|
18
|
+
"ctxjev-mcp": "./dist/index.js"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
22
|
+
"zod": "^4.6.5",
|
|
23
|
+
"ctxjev-core": "0.1.0"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@types/node": "^22",
|
|
27
|
+
"typescript": "^5.6.0",
|
|
28
|
+
"vitest": "^2.1.9"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsc -b",
|
|
32
|
+
"test": "vitest run"
|
|
33
|
+
}
|
|
34
|
+
}
|