@lucas-contrial/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/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,12 @@
1
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
2
+ import { ContrailMCPServer } from './server.js';
3
+ async function main() {
4
+ const contrail = new ContrailMCPServer();
5
+ const transport = new StdioServerTransport();
6
+ await contrail.getServer().connect(transport);
7
+ }
8
+ void main().catch((error) => {
9
+ console.error('Contrail MCP server failed to start:', error);
10
+ process.exitCode = 1;
11
+ });
12
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,KAAK,UAAU,IAAI;IACjB,MAAM,QAAQ,GAAG,IAAI,iBAAiB,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,QAAQ,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAChD,CAAC;AAED,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IACnC,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;IAC7D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { ContrailMCPServer } from './server.js';
2
+ export type { ContrailMCPServerOptions } from './server.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { ContrailMCPServer } from './server.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export interface ContrailMCPServerOptions {
3
+ storePath?: string;
4
+ }
5
+ export declare class ContrailMCPServer {
6
+ private server;
7
+ private storePath;
8
+ private toolHandlers;
9
+ constructor(options?: ContrailMCPServerOptions);
10
+ getServer(): McpServer;
11
+ getToolHandler(name: string): {
12
+ handler: (args: Record<string, unknown>) => Promise<{
13
+ content: Array<{
14
+ type: 'text';
15
+ text: string;
16
+ }>;
17
+ isError?: boolean;
18
+ }>;
19
+ } | undefined;
20
+ private registerTool;
21
+ private setupResources;
22
+ private setupTools;
23
+ }
24
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA6BpE,MAAM,WAAW,wBAAwB;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAmGD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAGN;gBAEF,OAAO,GAAE,wBAA6B;IAUlD,SAAS,IAAI,SAAS;IAItB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;YACpF,OAAO,EAAE,KAAK,CAAC;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;YAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;SACnB,CAAC,CAAA;KAAE,GAAG,SAAS;IAKd,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,UAAU;CAgLnB"}
package/dist/server.js ADDED
@@ -0,0 +1,283 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { readFileSync, appendFileSync, existsSync, mkdirSync, writeFileSync } from 'fs';
3
+ import { resolve } from 'path';
4
+ import { lock } from 'proper-lockfile';
5
+ import { z } from 'zod';
6
+ import { parseClaim, resolveCurrentBelief, resolveTrajectory } from '@lucas-contrial/core';
7
+ const STORE_DIR = '.contrail';
8
+ const STORE_FILE = 'claims.jsonl';
9
+ const LOCK_FILE = 'claims.jsonl.lock';
10
+ function getStorePath(cwd) {
11
+ const dir = resolve(cwd, STORE_DIR);
12
+ if (!existsSync(dir)) {
13
+ mkdirSync(dir, { recursive: true });
14
+ }
15
+ return resolve(dir, STORE_FILE);
16
+ }
17
+ function readClaims(storePath) {
18
+ if (!existsSync(storePath))
19
+ return [];
20
+ const content = readFileSync(storePath, 'utf-8');
21
+ if (!content.trim())
22
+ return [];
23
+ return content.trim().split('\n').map(line => JSON.parse(line));
24
+ }
25
+ function getLockPath(storePath) {
26
+ const dir = resolve(storePath, '..');
27
+ return resolve(dir, LOCK_FILE);
28
+ }
29
+ function toClaimEvidence(claim) {
30
+ return {
31
+ id: claim.id,
32
+ value: claim.value,
33
+ current_since: claim.valid_from ?? null,
34
+ recorded_confidence: claim.confidence,
35
+ source: claim.source
36
+ };
37
+ }
38
+ async function ensureLockDir(lockPath) {
39
+ const dir = resolve(lockPath, '..');
40
+ if (!existsSync(dir)) {
41
+ mkdirSync(dir, { recursive: true });
42
+ }
43
+ if (!existsSync(lockPath)) {
44
+ writeFileSync(lockPath, '', 'utf-8');
45
+ }
46
+ }
47
+ async function appendClaim(storePath, claim) {
48
+ const line = JSON.stringify(claim);
49
+ const lockPath = getLockPath(storePath);
50
+ await ensureLockDir(lockPath);
51
+ const release = await lock(lockPath, { retries: 5 });
52
+ try {
53
+ const dir = resolve(storePath, '..');
54
+ if (!existsSync(dir)) {
55
+ mkdirSync(dir, { recursive: true });
56
+ }
57
+ appendFileSync(storePath, line + '\n', 'utf-8');
58
+ }
59
+ finally {
60
+ await release();
61
+ }
62
+ }
63
+ function generateULID() {
64
+ const alphabet = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
65
+ let timestamp = Date.now();
66
+ let timestampStr = '';
67
+ for (let i = 0; i < 10; i++) {
68
+ timestampStr = alphabet[timestamp % 32] + timestampStr;
69
+ timestamp = Math.floor(timestamp / 32);
70
+ }
71
+ let randomStr = '';
72
+ for (let i = 0; i < 16; i++) {
73
+ randomStr += alphabet[Math.floor(Math.random() * 32)];
74
+ }
75
+ return timestampStr + randomStr;
76
+ }
77
+ function formatTrajectoryMCPError(error) {
78
+ switch (error.code) {
79
+ case 'MULTIPLE_HEADS': {
80
+ const pieces = [`Conflicting claims detected — ${error.message}`];
81
+ if (error.heads && error.heads.length > 0) {
82
+ for (const head of error.heads) {
83
+ pieces.push(` ${head.id}: "${String(head.value)}" (confidence ${head.confidence}, source: ${head.source?.tool ?? 'unknown'})`);
84
+ }
85
+ }
86
+ pieces.push('Resolve manually: add a new claim with the correct supersedes chain.');
87
+ return pieces.join('\n');
88
+ }
89
+ case 'CYCLE_DETECTED':
90
+ return `Cycle detected in supersedes chain${error.claimId ? ` at claim ${error.claimId}` : ''}.`;
91
+ case 'BROKEN_CHAIN':
92
+ return `Broken supersedes chain — missing claim ${error.claimId ?? 'unknown'}.`;
93
+ default:
94
+ return error.message;
95
+ }
96
+ }
97
+ export class ContrailMCPServer {
98
+ server;
99
+ storePath;
100
+ toolHandlers = new Map();
101
+ constructor(options = {}) {
102
+ this.storePath = options.storePath || getStorePath(process.cwd());
103
+ this.server = new McpServer({
104
+ name: 'contrail',
105
+ version: '0.1.0'
106
+ });
107
+ this.setupResources();
108
+ this.setupTools();
109
+ }
110
+ getServer() {
111
+ return this.server;
112
+ }
113
+ getToolHandler(name) {
114
+ const handler = this.toolHandlers.get(name);
115
+ return handler ? { handler: handler } : undefined;
116
+ }
117
+ registerTool(name, handler) {
118
+ this.toolHandlers.set(name, handler);
119
+ }
120
+ setupResources() {
121
+ this.server.resource('contrail-claims', 'contrail://claims', async (uri) => {
122
+ const claims = readClaims(this.storePath);
123
+ return {
124
+ contents: [{
125
+ uri: uri.href,
126
+ mimeType: 'application/json',
127
+ text: JSON.stringify(claims, null, 2)
128
+ }]
129
+ };
130
+ });
131
+ }
132
+ setupTools() {
133
+ const rememberHandler = async (args) => {
134
+ const a = args;
135
+ const id = generateULID();
136
+ const claim = {
137
+ schema_version: '0.1.0',
138
+ id,
139
+ subject: a.subject,
140
+ predicate: a.predicate,
141
+ value: a.value,
142
+ value_type: typeof a.value === 'number' ? 'number' :
143
+ typeof a.value === 'boolean' ? 'boolean' :
144
+ Array.isArray(a.value) ? 'list' : 'string',
145
+ confidence: a.confidence,
146
+ valid_from: new Date().toISOString(),
147
+ valid_until: null,
148
+ supersedes: a.supersedes || null,
149
+ source: {
150
+ tool: a.source_tool,
151
+ session_id: null,
152
+ kind: a.source_kind
153
+ },
154
+ visibility: 'private',
155
+ signature: null
156
+ };
157
+ const { claim: parsed, error } = await parseClaim(JSON.stringify(claim));
158
+ if (error) {
159
+ return {
160
+ content: [{
161
+ type: 'text',
162
+ text: `Error: ${error}`
163
+ }],
164
+ isError: true
165
+ };
166
+ }
167
+ await appendClaim(this.storePath, parsed);
168
+ return {
169
+ content: [{
170
+ type: 'text',
171
+ text: `Stored claim ${parsed.id} for ${parsed.subject}/${parsed.predicate}`
172
+ }]
173
+ };
174
+ };
175
+ const recallHandler = async (args) => {
176
+ const a = args;
177
+ const claims = readClaims(this.storePath);
178
+ let belief;
179
+ try {
180
+ belief = resolveCurrentBelief(claims, a.subject, a.predicate);
181
+ }
182
+ catch (e) {
183
+ const err = e;
184
+ return {
185
+ content: [{ type: 'text', text: formatTrajectoryMCPError(err) }],
186
+ isError: true
187
+ };
188
+ }
189
+ if (!belief) {
190
+ return {
191
+ content: [{
192
+ type: 'text',
193
+ text: `No claim found for ${a.subject}/${a.predicate}`
194
+ }]
195
+ };
196
+ }
197
+ const { current, previous, history } = belief;
198
+ const reasoningChain = history.slice().reverse().map(claim => ({
199
+ ...toClaimEvidence(claim),
200
+ status: claim.id === current.id ? 'current' : 'superseded'
201
+ }));
202
+ return {
203
+ content: [{
204
+ type: 'text',
205
+ text: JSON.stringify({
206
+ subject: a.subject,
207
+ predicate: a.predicate,
208
+ current_belief: toClaimEvidence(current),
209
+ why_this_is_current: previous
210
+ ? `This claim supersedes ${previous.id}, so it is the current instruction.`
211
+ : 'This is the only recorded instruction for this subject and predicate.',
212
+ superseded_claim: previous ? toClaimEvidence(previous) : null,
213
+ reasoning_chain: reasoningChain
214
+ }, null, 2)
215
+ }]
216
+ };
217
+ };
218
+ const trajectoryHandler = async (args) => {
219
+ const a = args;
220
+ const claims = readClaims(this.storePath);
221
+ let trajectory;
222
+ try {
223
+ trajectory = resolveTrajectory(claims, a.subject, a.predicate);
224
+ }
225
+ catch (e) {
226
+ const err = e;
227
+ return {
228
+ content: [{ type: 'text', text: formatTrajectoryMCPError(err) }],
229
+ isError: true
230
+ };
231
+ }
232
+ if (trajectory.claims.length === 0) {
233
+ return {
234
+ content: [{
235
+ type: 'text',
236
+ text: `No claims found for ${a.subject}/${a.predicate}`
237
+ }]
238
+ };
239
+ }
240
+ const history = trajectory.claims.map((claim, i) => ({
241
+ position: i + 1,
242
+ id: claim.id,
243
+ value: claim.value,
244
+ confidence: claim.confidence,
245
+ source: claim.source,
246
+ valid_from: claim.valid_from,
247
+ isHead: claim.id === trajectory.head?.id
248
+ }));
249
+ return {
250
+ content: [{
251
+ type: 'text',
252
+ text: JSON.stringify({
253
+ subject: a.subject,
254
+ predicate: a.predicate,
255
+ totalClaims: history.length,
256
+ history
257
+ }, null, 2)
258
+ }]
259
+ };
260
+ };
261
+ this.server.tool('contrail_remember', 'Store a new claim about the user', {
262
+ subject: z.string().describe('Who/what this claim is about (default: "self")'),
263
+ predicate: z.string().describe('Namespaced key: category.key'),
264
+ value: z.any().describe('The claim content'),
265
+ confidence: z.number().min(0).max(1).describe('Certainty 0.0-1.0'),
266
+ source_tool: z.string().describe('Tool/system that produced this claim'),
267
+ source_kind: z.enum(['explicit-statement', 'inferred', 'imported', 'corrected']).describe('How the claim was produced'),
268
+ supersedes: z.string().optional().describe('ULID of claim to supersede')
269
+ }, rememberHandler);
270
+ this.registerTool('contrail_remember', rememberHandler);
271
+ this.server.tool('contrail_recall', 'Retrieve the current project instruction and the supersession evidence behind it', {
272
+ subject: z.string().describe('Who/what to recall about (default: "self")'),
273
+ predicate: z.string().describe('Namespaced key to recall')
274
+ }, recallHandler);
275
+ this.registerTool('contrail_recall', recallHandler);
276
+ this.server.tool('contrail_trajectory', 'Show the full belief history for a subject/predicate', {
277
+ subject: z.string().describe('Who/what trajectory to show (default: "self")'),
278
+ predicate: z.string().describe('Namespaced key trajectory')
279
+ }, trajectoryHandler);
280
+ this.registerTool('contrail_trajectory', trajectoryHandler);
281
+ }
282
+ }
283
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@lucas-contrial/mcp",
3
+ "version": "0.1.0",
4
+ "description": "Contrail MCP server for versioned project instructions",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "contrail-mcp": "./dist/cli.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/index.js",
14
+ "types": "./dist/index.d.ts"
15
+ }
16
+ },
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "test": "vitest run",
20
+ "test:watch": "vitest",
21
+ "test:coverage": "vitest run --coverage",
22
+ "lint": "eslint src --ext .ts",
23
+ "typecheck": "tsc --noEmit"
24
+ },
25
+ "keywords": [
26
+ "contrail",
27
+ "mcp",
28
+ "model-context-protocol",
29
+ "ai-memory"
30
+ ],
31
+ "license": "Apache-2.0",
32
+ "files": [
33
+ "dist"
34
+ ],
35
+ "dependencies": {
36
+ "@lucas-contrial/core": "^0.1.0",
37
+ "@modelcontextprotocol/sdk": "^1.0.0",
38
+ "proper-lockfile": "^4.1.2",
39
+ "zod": "^3.23.0"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "^20.12.0",
43
+ "@types/proper-lockfile": "^4.1.4",
44
+ "@vitest/coverage-v8": "^4.1.10",
45
+ "typescript": "^5.4.0",
46
+ "vitest": "^4.1.10"
47
+ }
48
+ }