prelude-context 1.4.3 → 1.5.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/README.md CHANGED
@@ -171,6 +171,80 @@ prelude watch
171
171
  # Press Ctrl+C when done to save the session
172
172
  ```
173
173
 
174
+ ### `prelude serve`
175
+ Starts Prelude as an MCP server over stdio transport:
176
+ ```bash
177
+ prelude serve # Serve context for current directory
178
+ prelude serve --root ~/my-project # Serve context for a specific project
179
+ ```
180
+
181
+ AI tools connect to this server to query your project context programmatically — no clipboard needed.
182
+
183
+ ### `prelude mcp-config`
184
+ Prints the configuration snippet to connect Prelude to your AI tool:
185
+ ```bash
186
+ prelude mcp-config --client claude-code # Default
187
+ prelude mcp-config --client claude-desktop
188
+ prelude mcp-config --client cursor
189
+ ```
190
+
191
+ ---
192
+
193
+ ## MCP Server Integration
194
+
195
+ Prelude can run as an [MCP](https://modelcontextprotocol.io/) (Model Context Protocol) server, making your project context directly available to AI tools like Claude Code, Claude Desktop, and Cursor — no copy-paste required.
196
+
197
+ ### Quick Setup (Claude Code)
198
+
199
+ ```bash
200
+ # From your project directory (must have .context/ — run prelude init first)
201
+ prelude mcp-config --client claude-code
202
+ ```
203
+
204
+ This prints the command to register Prelude as an MCP server. Once connected, your AI tools have access to three tools:
205
+
206
+ | Tool | Description |
207
+ |------|-------------|
208
+ | `prelude_query` | Full-power context queries with topic, scope, and type filtering |
209
+ | `prelude_compact` | Token-efficient context for prompt injection (~800 tokens) |
210
+ | `prelude_status` | Check which context files are available |
211
+
212
+ And three resources for passive context discovery:
213
+
214
+ | Resource URI | Description |
215
+ |-------------|-------------|
216
+ | `prelude://context/full` | Complete project context as markdown |
217
+ | `prelude://context/compact` | Token-efficient summary |
218
+ | `prelude://context/{type}` | Individual context files (project, stack, architecture, constraints, decisions) |
219
+
220
+ ### Other Clients
221
+
222
+ ```bash
223
+ prelude mcp-config --client claude-desktop
224
+ prelude mcp-config --client cursor
225
+ ```
226
+
227
+ ### Manual Setup
228
+
229
+ Start the server directly:
230
+
231
+ ```bash
232
+ prelude serve --root /path/to/your/project
233
+ ```
234
+
235
+ The server uses stdio transport. Configure your MCP client to run this command.
236
+
237
+ ### `prelude mcp-config [options]`
238
+
239
+ Prints the configuration snippet for connecting Prelude to your AI tool:
240
+
241
+ ```bash
242
+ prelude mcp-config # Claude Code (default)
243
+ prelude mcp-config --client claude-desktop # Claude Desktop
244
+ prelude mcp-config --client cursor # Cursor
245
+ prelude mcp-config --root /path/to/project # Specify project root
246
+ ```
247
+
174
248
  ---
175
249
 
176
250
  ## Use Cases
@@ -363,12 +437,14 @@ Yes! While the CLI is built with Node.js, the Prelude format works with any lang
363
437
 
364
438
  - [x] Smart context updates with manual edit preservation
365
439
  - [x] Scoped context query engine (`prelude query`)
440
+ - [x] MCP server for AI tool integration (`prelude serve`)
366
441
  - [ ] Improved inference for Python, Rust, Go
367
442
  - [ ] VS Code extension for inline context
368
443
  - [ ] GitHub Action for automated updates
369
444
  - [ ] Plugin system for custom inference
370
445
  - [ ] CLI validation command
371
446
  - [ ] Context diff tool
447
+ - [ ] Temporal brain layer (learned heuristics from AI tool usage)
372
448
 
373
449
  ---
374
450
 
@@ -26,6 +26,8 @@ import { registerDecisionCommand } from '../src/commands/decision.js';
26
26
  import { registerWatchCommand } from '../src/commands/watch.js';
27
27
  import { registerQueryCommand } from '../src/commands/query.js';
28
28
  import { registerCompactCommand } from '../src/commands/compact.js';
29
+ import { registerServeCommand } from '../src/commands/serve.js';
30
+ import { registerMcpConfigCommand } from '../src/commands/mcp-config.js';
29
31
  import { update } from '../src/commands/update.js';
30
32
  // Register all commands
31
33
  registerInitCommand(cli);
@@ -35,6 +37,8 @@ registerDecisionCommand(cli);
35
37
  registerWatchCommand(cli);
36
38
  registerQueryCommand(cli);
37
39
  registerCompactCommand(cli);
40
+ registerServeCommand(cli);
41
+ registerMcpConfigCommand(cli);
38
42
  // Register update command
39
43
  cli
40
44
  .command('update', 'Update context by re-analyzing the codebase')
@@ -1 +1 @@
1
- {"version":3,"file":"prelude.js","sourceRoot":"","sources":["../../bin/prelude.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,0DAA0D;AAC1D,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,+DAA+D;AAC/D,IAAI,WAAgB,CAAC;AACrB,IAAI,CAAC;IACH,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AACzF,CAAC;AAAC,MAAM,CAAC;IACP,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;AAE3B,GAAG;KACA,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;KAC5B,IAAI,EAAE,CAAC;AAEV,kBAAkB;AAClB,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAEnD,wBAAwB;AACxB,mBAAmB,CAAC,GAAG,CAAC,CAAC;AACzB,qBAAqB,CAAC,GAAG,CAAC,CAAC;AAC3B,oBAAoB,CAAC,GAAG,CAAC,CAAC;AAC1B,uBAAuB,CAAC,GAAG,CAAC,CAAC;AAC7B,oBAAoB,CAAC,GAAG,CAAC,CAAC;AAC1B,oBAAoB,CAAC,GAAG,CAAC,CAAC;AAC1B,sBAAsB,CAAC,GAAG,CAAC,CAAC;AAE5B,0BAA0B;AAC1B,GAAG;KACA,OAAO,CAAC,QAAQ,EAAE,6CAA6C,CAAC;KAChE,MAAM,CAAC,SAAS,EAAE,+BAA+B,CAAC;KAClD,MAAM,CAAC,WAAW,EAAE,yCAAyC,CAAC;KAC9D,MAAM,CAAC,eAAe,EAAE,wBAAwB,CAAC;KACjD,MAAM,CAAC,UAAU,EAAE,gBAAgB,CAAC;KACpC,MAAM,CAAC,MAAM,CAAC,CAAC;AAElB,gBAAgB;AAChB,GAAG,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"prelude.js","sourceRoot":"","sources":["../../bin/prelude.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,0DAA0D;AAC1D,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,+DAA+D;AAC/D,IAAI,WAAgB,CAAC;AACrB,IAAI,CAAC;IACH,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AACzF,CAAC;AAAC,MAAM,CAAC;IACP,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;AAE3B,GAAG;KACA,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;KAC5B,IAAI,EAAE,CAAC;AAEV,kBAAkB;AAClB,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAEnD,wBAAwB;AACxB,mBAAmB,CAAC,GAAG,CAAC,CAAC;AACzB,qBAAqB,CAAC,GAAG,CAAC,CAAC;AAC3B,oBAAoB,CAAC,GAAG,CAAC,CAAC;AAC1B,uBAAuB,CAAC,GAAG,CAAC,CAAC;AAC7B,oBAAoB,CAAC,GAAG,CAAC,CAAC;AAC1B,oBAAoB,CAAC,GAAG,CAAC,CAAC;AAC1B,sBAAsB,CAAC,GAAG,CAAC,CAAC;AAC5B,oBAAoB,CAAC,GAAG,CAAC,CAAC;AAC1B,wBAAwB,CAAC,GAAG,CAAC,CAAC;AAE9B,0BAA0B;AAC1B,GAAG;KACA,OAAO,CAAC,QAAQ,EAAE,6CAA6C,CAAC;KAChE,MAAM,CAAC,SAAS,EAAE,+BAA+B,CAAC;KAClD,MAAM,CAAC,WAAW,EAAE,yCAAyC,CAAC;KAC9D,MAAM,CAAC,eAAe,EAAE,wBAAwB,CAAC;KACjD,MAAM,CAAC,UAAU,EAAE,gBAAgB,CAAC;KACpC,MAAM,CAAC,MAAM,CAAC,CAAC;AAElB,gBAAgB;AAChB,GAAG,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CAC } from 'cac';
2
+ export declare function registerMcpConfigCommand(cli: CAC): void;
3
+ //# sourceMappingURL=mcp-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config.d.ts","sourceRoot":"","sources":["../../../src/commands/mcp-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAI/B,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,GAAG,QAsEhD"}
@@ -0,0 +1,72 @@
1
+ import { resolve } from 'path';
2
+ import { execSync } from 'child_process';
3
+ export function registerMcpConfigCommand(cli) {
4
+ cli
5
+ .command('mcp-config', 'Print MCP server configuration for AI tool integration')
6
+ .option('--root <path>', 'Project root directory (default: cwd)')
7
+ .option('--client <name>', 'Target client: claude-desktop, claude-code, cursor', { default: 'claude-code' })
8
+ .action(async (options) => {
9
+ const rootDir = resolve(options.root || process.cwd());
10
+ // Find the prelude binary path
11
+ let preludePath;
12
+ try {
13
+ preludePath = execSync('which prelude', { encoding: 'utf-8' }).trim();
14
+ }
15
+ catch {
16
+ // Fallback: assume npx
17
+ preludePath = 'npx';
18
+ }
19
+ const isNpx = preludePath === 'npx';
20
+ const command = isNpx ? 'npx' : preludePath;
21
+ const args = isNpx
22
+ ? ['prelude-context', 'serve', '--root', rootDir]
23
+ : ['serve', '--root', rootDir];
24
+ const serverConfig = {
25
+ command,
26
+ args,
27
+ };
28
+ const client = options.client || 'claude-code';
29
+ if (client === 'claude-code') {
30
+ // Claude Code uses: claude mcp add <name> -- <command> <args...>
31
+ const addCommand = isNpx
32
+ ? `claude mcp add prelude-context -- npx prelude-context serve --root ${rootDir}`
33
+ : `claude mcp add prelude-context -- ${preludePath} serve --root ${rootDir}`;
34
+ console.log('# Claude Code\n');
35
+ console.log('Run this command:\n');
36
+ console.log(` ${addCommand}\n`);
37
+ console.log('Or add to .mcp.json in your project root:\n');
38
+ console.log(JSON.stringify({
39
+ mcpServers: {
40
+ 'prelude-context': serverConfig
41
+ }
42
+ }, null, 2));
43
+ }
44
+ else if (client === 'claude-desktop') {
45
+ // Claude Desktop uses claude_desktop_config.json
46
+ console.log('# Claude Desktop\n');
47
+ console.log('Add to ~/Library/Application Support/Claude/claude_desktop_config.json:\n');
48
+ console.log(JSON.stringify({
49
+ mcpServers: {
50
+ 'prelude-context': serverConfig
51
+ }
52
+ }, null, 2));
53
+ }
54
+ else if (client === 'cursor') {
55
+ console.log('# Cursor\n');
56
+ console.log('Add to .cursor/mcp.json in your project root:\n');
57
+ console.log(JSON.stringify({
58
+ mcpServers: {
59
+ 'prelude-context': serverConfig
60
+ }
61
+ }, null, 2));
62
+ }
63
+ else {
64
+ // Generic MCP config
65
+ console.log('# MCP Server Configuration\n');
66
+ console.log(JSON.stringify({
67
+ 'prelude-context': serverConfig
68
+ }, null, 2));
69
+ }
70
+ });
71
+ }
72
+ //# sourceMappingURL=mcp-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../../src/commands/mcp-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CAC } from 'cac';
2
+ export declare function registerServeCommand(cli: CAC): void;
3
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../src/commands/serve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAO/B,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,QA4B5C"}
@@ -0,0 +1,29 @@
1
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
2
+ import { createPreludeServer } from '../mcp/server.js';
3
+ import { CONTEXT_DIR } from '../constants.js';
4
+ import { fileExists } from '../utils/fs.js';
5
+ import { join } from 'path';
6
+ export function registerServeCommand(cli) {
7
+ cli
8
+ .command('serve', 'Start Prelude as an MCP server (stdio transport)')
9
+ .option('--root <path>', 'Root directory of the project (default: cwd)')
10
+ .action(async (options) => {
11
+ const rootDir = options.root || process.cwd();
12
+ // Validate .context/ exists
13
+ const externalRoot = process.env.PRELUDE_ROOT;
14
+ const contextDir = externalRoot
15
+ ? join(externalRoot, rootDir.split('/').pop())
16
+ : join(rootDir, CONTEXT_DIR);
17
+ if (!(await fileExists(contextDir))) {
18
+ // Write to stderr since stdout is the MCP transport
19
+ process.stderr.write('Error: .context/ directory not found. Run `prelude init` first.\n');
20
+ process.exit(1);
21
+ }
22
+ const server = createPreludeServer(rootDir);
23
+ const transport = new StdioServerTransport();
24
+ await server.connect(transport);
25
+ // Log to stderr (stdout is MCP transport)
26
+ process.stderr.write(`Prelude MCP server started for: ${rootDir}\n`);
27
+ });
28
+ }
29
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/commands/serve.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,UAAU,oBAAoB,CAAC,GAAQ;IAC3C,GAAG;SACA,OAAO,CAAC,OAAO,EAAE,kDAAkD,CAAC;SACpE,MAAM,CAAC,eAAe,EAAE,8CAA8C,CAAC;SACvE,MAAM,CAAC,KAAK,EAAE,OAA0B,EAAE,EAAE;QAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAE9C,4BAA4B;QAC5B,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QAC9C,MAAM,UAAU,GAAG,YAAY;YAC7B,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAY,CAAC;YACxD,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAE/B,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YACpC,oDAAoD;YACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,mEAAmE,CACpE,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEhC,0CAA0C;QAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,OAAO,IAAI,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function createPreludeServer(rootDir: string): McpServer;
3
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AAStF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAqM9D"}
@@ -0,0 +1,162 @@
1
+ import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { z } from 'zod';
3
+ import { join } from 'path';
4
+ import { executeQuery, VALID_TYPES } from '../core/query-engine.js';
5
+ import { exportCompact } from '../core/compact.js';
6
+ import { fileExists, readJSON } from '../utils/fs.js';
7
+ import { CONTEXT_DIR, CONTEXT_FILES } from '../constants.js';
8
+ export function createPreludeServer(rootDir) {
9
+ const server = new McpServer({
10
+ name: 'prelude-context',
11
+ version: '1.5.0',
12
+ });
13
+ server.tool('prelude_query', 'Query project context by topic, scope, or type. Returns structured context about the codebase.', {
14
+ topic: z.string().optional().describe('Filter context by topic keyword (e.g. "database", "auth", "testing")'),
15
+ scope: z.string().optional().describe('Filter to a specific directory path (e.g. "src/api", "packages/db")'),
16
+ type: z.enum(VALID_TYPES).optional().describe('Return only a specific context type'),
17
+ format: z.enum(['md', 'json']).default('md').describe('Output format — md for reading, json for parsing'),
18
+ max_tokens: z.number().positive().optional().describe('Approximate token budget for the response'),
19
+ }, async ({ topic, scope, type, format, max_tokens }) => {
20
+ if (!topic && !scope && !type) {
21
+ return {
22
+ content: [{ type: 'text', text: 'Error: Provide at least one filter — topic, scope, or type.' }],
23
+ isError: true,
24
+ };
25
+ }
26
+ try {
27
+ const { output, tokenEstimate } = await executeQuery(rootDir, {
28
+ topic,
29
+ scope,
30
+ type,
31
+ format,
32
+ maxTokens: max_tokens,
33
+ });
34
+ return {
35
+ content: [{ type: 'text', text: output }],
36
+ _meta: { tokenEstimate },
37
+ };
38
+ }
39
+ catch (e) {
40
+ return {
41
+ content: [{ type: 'text', text: `Error: ${e instanceof Error ? e.message : String(e)}` }],
42
+ isError: true,
43
+ };
44
+ }
45
+ });
46
+ server.tool('prelude_compact', 'Get compact, token-efficient context for LLM prompt injection. Returns flat prefixed lines.', {
47
+ topic: z.string().optional().describe('Filter context by topic keyword'),
48
+ scope: z.string().optional().describe('Filter to a specific directory path'),
49
+ max_tokens: z.number().positive().default(800).describe('Token budget (default 800)'),
50
+ }, async ({ topic, scope, max_tokens }) => {
51
+ try {
52
+ const output = await exportCompact(rootDir, {
53
+ topic,
54
+ scope,
55
+ maxTokens: max_tokens,
56
+ });
57
+ return { content: [{ type: 'text', text: output }] };
58
+ }
59
+ catch (e) {
60
+ return {
61
+ content: [{ type: 'text', text: `Error: ${e instanceof Error ? e.message : String(e)}` }],
62
+ isError: true,
63
+ };
64
+ }
65
+ });
66
+ server.tool('prelude_status', 'Check Prelude status — which context files exist and basic project info.', {}, async () => {
67
+ try {
68
+ const externalRoot = process.env.PRELUDE_ROOT;
69
+ const contextDir = externalRoot
70
+ ? join(externalRoot, rootDir.split('/').pop())
71
+ : join(rootDir, CONTEXT_DIR);
72
+ const fileNames = [
73
+ CONTEXT_FILES.PROJECT,
74
+ CONTEXT_FILES.STACK,
75
+ CONTEXT_FILES.ARCHITECTURE,
76
+ CONTEXT_FILES.CONSTRAINTS,
77
+ CONTEXT_FILES.DECISIONS,
78
+ ];
79
+ const existResults = await Promise.all(fileNames.map(f => fileExists(join(contextDir, f))));
80
+ const files = fileNames.filter((_, i) => existResults[i]);
81
+ let project = null;
82
+ if (existResults[0]) {
83
+ const data = await readJSON(join(contextDir, CONTEXT_FILES.PROJECT));
84
+ project = { name: data.name, description: data.description };
85
+ }
86
+ const status = { contextDir, files, project };
87
+ return { content: [{ type: 'text', text: JSON.stringify(status, null, 2) }] };
88
+ }
89
+ catch (e) {
90
+ return {
91
+ content: [{ type: 'text', text: `Error: ${e instanceof Error ? e.message : String(e)}` }],
92
+ isError: true,
93
+ };
94
+ }
95
+ });
96
+ // --- Resources (passive context) ---
97
+ server.resource('full-context', 'prelude://context/full', async (uri) => {
98
+ const { exportToMarkdown } = await import('../core/exporter.js');
99
+ const markdown = await exportToMarkdown(rootDir);
100
+ return {
101
+ contents: [{
102
+ uri: uri.href,
103
+ mimeType: 'text/markdown',
104
+ text: markdown,
105
+ }],
106
+ };
107
+ });
108
+ server.resource('compact-context', 'prelude://context/compact', async (uri) => {
109
+ const output = await exportCompact(rootDir, { maxTokens: 800 });
110
+ return {
111
+ contents: [{
112
+ uri: uri.href,
113
+ mimeType: 'text/plain',
114
+ text: output,
115
+ }],
116
+ };
117
+ });
118
+ server.resource('context-by-type', new ResourceTemplate('prelude://context/{type}', { list: undefined }), async (uri, variables) => {
119
+ const typeStr = variables.type;
120
+ const fileMap = {
121
+ project: CONTEXT_FILES.PROJECT,
122
+ stack: CONTEXT_FILES.STACK,
123
+ architecture: CONTEXT_FILES.ARCHITECTURE,
124
+ constraints: CONTEXT_FILES.CONSTRAINTS,
125
+ decisions: CONTEXT_FILES.DECISIONS,
126
+ };
127
+ const filename = fileMap[typeStr];
128
+ if (!filename) {
129
+ return {
130
+ contents: [{
131
+ uri: uri.href,
132
+ mimeType: 'text/plain',
133
+ text: `Unknown context type: ${typeStr}. Valid types: ${Object.keys(fileMap).join(', ')}`,
134
+ }],
135
+ };
136
+ }
137
+ const externalRoot = process.env.PRELUDE_ROOT;
138
+ const contextDir = externalRoot
139
+ ? join(externalRoot, rootDir.split('/').pop())
140
+ : join(rootDir, CONTEXT_DIR);
141
+ const filePath = join(contextDir, filename);
142
+ if (!(await fileExists(filePath))) {
143
+ return {
144
+ contents: [{
145
+ uri: uri.href,
146
+ mimeType: 'text/plain',
147
+ text: `Context file not found: ${filename}. Run \`prelude init\` to generate it.`,
148
+ }],
149
+ };
150
+ }
151
+ const data = await readJSON(filePath);
152
+ return {
153
+ contents: [{
154
+ uri: uri.href,
155
+ mimeType: 'application/json',
156
+ text: JSON.stringify(data, null, 2),
157
+ }],
158
+ };
159
+ });
160
+ return server;
161
+ }
162
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -12,14 +12,14 @@ export declare const FieldStateSchema: z.ZodObject<{
12
12
  }, "strip", z.ZodTypeAny, {
13
13
  source: "inferred" | "manual" | "merged";
14
14
  value?: any;
15
- lastInferred?: string | undefined;
16
15
  lastModified?: string | undefined;
16
+ lastInferred?: string | undefined;
17
17
  inferredHash?: string | undefined;
18
18
  }, {
19
19
  source: "inferred" | "manual" | "merged";
20
20
  value?: any;
21
- lastInferred?: string | undefined;
22
21
  lastModified?: string | undefined;
22
+ lastInferred?: string | undefined;
23
23
  inferredHash?: string | undefined;
24
24
  }>;
25
25
  export declare const FileStateSchema: z.ZodObject<{
@@ -34,14 +34,14 @@ export declare const FileStateSchema: z.ZodObject<{
34
34
  }, "strip", z.ZodTypeAny, {
35
35
  source: "inferred" | "manual" | "merged";
36
36
  value?: any;
37
- lastInferred?: string | undefined;
38
37
  lastModified?: string | undefined;
38
+ lastInferred?: string | undefined;
39
39
  inferredHash?: string | undefined;
40
40
  }, {
41
41
  source: "inferred" | "manual" | "merged";
42
42
  value?: any;
43
- lastInferred?: string | undefined;
44
43
  lastModified?: string | undefined;
44
+ lastInferred?: string | undefined;
45
45
  inferredHash?: string | undefined;
46
46
  }>>;
47
47
  }, "strip", z.ZodTypeAny, {
@@ -50,8 +50,8 @@ export declare const FileStateSchema: z.ZodObject<{
50
50
  fields: Record<string, {
51
51
  source: "inferred" | "manual" | "merged";
52
52
  value?: any;
53
- lastInferred?: string | undefined;
54
53
  lastModified?: string | undefined;
54
+ lastInferred?: string | undefined;
55
55
  inferredHash?: string | undefined;
56
56
  }>;
57
57
  }, {
@@ -60,8 +60,8 @@ export declare const FileStateSchema: z.ZodObject<{
60
60
  fields: Record<string, {
61
61
  source: "inferred" | "manual" | "merged";
62
62
  value?: any;
63
- lastInferred?: string | undefined;
64
63
  lastModified?: string | undefined;
64
+ lastInferred?: string | undefined;
65
65
  inferredHash?: string | undefined;
66
66
  }>;
67
67
  }>;
@@ -81,14 +81,14 @@ export declare const PreludeStateSchema: z.ZodObject<{
81
81
  }, "strip", z.ZodTypeAny, {
82
82
  source: "inferred" | "manual" | "merged";
83
83
  value?: any;
84
- lastInferred?: string | undefined;
85
84
  lastModified?: string | undefined;
85
+ lastInferred?: string | undefined;
86
86
  inferredHash?: string | undefined;
87
87
  }, {
88
88
  source: "inferred" | "manual" | "merged";
89
89
  value?: any;
90
- lastInferred?: string | undefined;
91
90
  lastModified?: string | undefined;
91
+ lastInferred?: string | undefined;
92
92
  inferredHash?: string | undefined;
93
93
  }>>;
94
94
  }, "strip", z.ZodTypeAny, {
@@ -97,8 +97,8 @@ export declare const PreludeStateSchema: z.ZodObject<{
97
97
  fields: Record<string, {
98
98
  source: "inferred" | "manual" | "merged";
99
99
  value?: any;
100
- lastInferred?: string | undefined;
101
100
  lastModified?: string | undefined;
101
+ lastInferred?: string | undefined;
102
102
  inferredHash?: string | undefined;
103
103
  }>;
104
104
  }, {
@@ -107,8 +107,8 @@ export declare const PreludeStateSchema: z.ZodObject<{
107
107
  fields: Record<string, {
108
108
  source: "inferred" | "manual" | "merged";
109
109
  value?: any;
110
- lastInferred?: string | undefined;
111
110
  lastModified?: string | undefined;
111
+ lastInferred?: string | undefined;
112
112
  inferredHash?: string | undefined;
113
113
  }>;
114
114
  }>, "many">;
@@ -120,8 +120,8 @@ export declare const PreludeStateSchema: z.ZodObject<{
120
120
  fields: Record<string, {
121
121
  source: "inferred" | "manual" | "merged";
122
122
  value?: any;
123
- lastInferred?: string | undefined;
124
123
  lastModified?: string | undefined;
124
+ lastInferred?: string | undefined;
125
125
  inferredHash?: string | undefined;
126
126
  }>;
127
127
  }[];
@@ -134,8 +134,8 @@ export declare const PreludeStateSchema: z.ZodObject<{
134
134
  fields: Record<string, {
135
135
  source: "inferred" | "manual" | "merged";
136
136
  value?: any;
137
- lastInferred?: string | undefined;
138
137
  lastModified?: string | undefined;
138
+ lastInferred?: string | undefined;
139
139
  inferredHash?: string | undefined;
140
140
  }>;
141
141
  }[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prelude-context",
3
- "version": "1.4.3",
3
+ "version": "1.5.0",
4
4
  "description": "The open standard for expressing and maintaining machine-readable context about a codebase",
5
5
  "type": "module",
6
6
  "bin": {
@@ -35,6 +35,7 @@
35
35
  },
36
36
  "license": "MIT",
37
37
  "dependencies": {
38
+ "@modelcontextprotocol/sdk": "^1.29.0",
38
39
  "cac": "^6.7.14",
39
40
  "chokidar": "^3.6.0",
40
41
  "colorette": "^2.0.20",