screencoach-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/README.md ADDED
@@ -0,0 +1,69 @@
1
+ # screencoach-mcp
2
+
3
+ MCP (Model Context Protocol) server for ScreenCoach - AI-powered screen context and memory assistant.
4
+
5
+ This server provides Claude and other AI assistants with access to your screen recordings and audio transcriptions via [screenpipe](https://screenpi.pe).
6
+
7
+ ## Features
8
+
9
+ - **Search Screen Content**: Search through OCR text from screen recordings
10
+ - **Search Audio**: Search through audio transcriptions
11
+ - **Recent Context**: Get recent screen/audio activity
12
+ - **Frame Access**: Retrieve specific screenshots and their OCR data
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ npx screencoach-mcp
18
+ ```
19
+
20
+ Or install globally:
21
+
22
+ ```bash
23
+ npm install -g screencoach-mcp
24
+ ```
25
+
26
+ ## Configuration
27
+
28
+ ### Claude Desktop
29
+
30
+ Add to your `claude_desktop_config.json`:
31
+
32
+ **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
33
+ **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
34
+
35
+ ```json
36
+ {
37
+ "mcpServers": {
38
+ "screencoach": {
39
+ "command": "npx",
40
+ "args": ["-y", "screencoach-mcp"]
41
+ }
42
+ }
43
+ }
44
+ ```
45
+
46
+ ### Environment Variables
47
+
48
+ - `SCREENPIPE_API_URL`: Screenpipe API URL (default: `http://localhost:3030`)
49
+
50
+ ## Tools
51
+
52
+ | Tool | Description |
53
+ |------|-------------|
54
+ | `search_screen_content` | Search OCR, audio, and UI content |
55
+ | `get_recent_context` | Get activity from last N minutes |
56
+ | `get_frame` | Get a specific screenshot frame |
57
+ | `get_frame_ocr` | Get OCR text from a frame |
58
+ | `list_audio_devices` | List recording audio devices |
59
+ | `list_monitors` | List recording monitors |
60
+ | `health_check` | Check screenpipe connection |
61
+
62
+ ## Requirements
63
+
64
+ - [screenpipe](https://screenpi.pe) must be running on your machine
65
+ - Node.js 18+
66
+
67
+ ## License
68
+
69
+ MIT
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * ScreenCoach MCP Server
4
+ * Provides AI assistants with access to screen recordings and audio transcriptions
5
+ * via the screenpipe API
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;GAIG"}
package/dist/index.js ADDED
@@ -0,0 +1,351 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * ScreenCoach MCP Server
4
+ * Provides AI assistants with access to screen recordings and audio transcriptions
5
+ * via the screenpipe API
6
+ */
7
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
8
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
9
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
10
+ // Screenpipe API URL (can be overridden via environment variable)
11
+ const SCREENPIPE_API_URL = process.env.SCREENPIPE_API_URL || 'http://localhost:3030';
12
+ // ==================== Screenpipe API Client ====================
13
+ async function screenpipeGet(path, params) {
14
+ const url = params
15
+ ? `${SCREENPIPE_API_URL}${path}?${params.toString()}`
16
+ : `${SCREENPIPE_API_URL}${path}`;
17
+ const response = await fetch(url, {
18
+ method: 'GET',
19
+ headers: { Accept: 'application/json' },
20
+ signal: AbortSignal.timeout(15000),
21
+ });
22
+ if (!response.ok) {
23
+ throw new Error(`Screenpipe API error: ${response.status} ${response.statusText}`);
24
+ }
25
+ return response.json();
26
+ }
27
+ async function checkScreenpipeHealth() {
28
+ try {
29
+ const response = await fetch(`${SCREENPIPE_API_URL}/health`, {
30
+ method: 'GET',
31
+ signal: AbortSignal.timeout(3000),
32
+ });
33
+ return response.ok;
34
+ }
35
+ catch {
36
+ return false;
37
+ }
38
+ }
39
+ // ==================== Tool Definitions ====================
40
+ const TOOLS = [
41
+ {
42
+ name: 'search_screen_content',
43
+ description: `Search through screen recordings (OCR), audio transcriptions, and UI content.
44
+ Use this to find what the user saw or heard on their computer.
45
+ - Omit 'query' to get all recent content
46
+ - Use content_type to filter: 'ocr' (screen text), 'audio' (voice/sounds), 'ui' (UI elements), or 'all'
47
+ - Time filters use ISO 8601 format (e.g., "2024-01-15T09:00:00Z")`,
48
+ inputSchema: {
49
+ type: 'object',
50
+ properties: {
51
+ query: {
52
+ type: 'string',
53
+ description: 'Search query. Omit to return all recent content.',
54
+ },
55
+ content_type: {
56
+ type: 'string',
57
+ enum: ['all', 'ocr', 'audio', 'ui'],
58
+ description: 'Type of content to search. Default: all',
59
+ },
60
+ limit: {
61
+ type: 'number',
62
+ description: 'Maximum results to return. Default: 10',
63
+ },
64
+ offset: {
65
+ type: 'number',
66
+ description: 'Skip N results for pagination. Default: 0',
67
+ },
68
+ start_time: {
69
+ type: 'string',
70
+ description: 'ISO 8601 UTC start time filter',
71
+ },
72
+ end_time: {
73
+ type: 'string',
74
+ description: 'ISO 8601 UTC end time filter',
75
+ },
76
+ app_name: {
77
+ type: 'string',
78
+ description: 'Filter by application name',
79
+ },
80
+ window_name: {
81
+ type: 'string',
82
+ description: 'Filter by window title',
83
+ },
84
+ },
85
+ },
86
+ },
87
+ {
88
+ name: 'get_recent_context',
89
+ description: `Get the most recent screen and audio context from the last N minutes.
90
+ Use this to understand what the user has been doing recently.`,
91
+ inputSchema: {
92
+ type: 'object',
93
+ properties: {
94
+ minutes: {
95
+ type: 'number',
96
+ description: 'How many minutes of history to retrieve. Default: 5',
97
+ },
98
+ content_type: {
99
+ type: 'string',
100
+ enum: ['all', 'ocr', 'audio', 'ui'],
101
+ description: 'Type of content to retrieve. Default: all',
102
+ },
103
+ limit: {
104
+ type: 'number',
105
+ description: 'Maximum results. Default: 20',
106
+ },
107
+ },
108
+ },
109
+ },
110
+ {
111
+ name: 'get_frame',
112
+ description: `Get a specific screen capture frame by ID.
113
+ Returns the frame metadata and optionally the image data.`,
114
+ inputSchema: {
115
+ type: 'object',
116
+ properties: {
117
+ frame_id: {
118
+ type: 'number',
119
+ description: 'The frame ID to retrieve',
120
+ },
121
+ include_image: {
122
+ type: 'boolean',
123
+ description: 'Whether to include base64 image data. Default: false',
124
+ },
125
+ },
126
+ required: ['frame_id'],
127
+ },
128
+ },
129
+ {
130
+ name: 'get_frame_ocr',
131
+ description: `Get the OCR (text recognition) results for a specific frame.
132
+ Use this to read text from a screenshot.`,
133
+ inputSchema: {
134
+ type: 'object',
135
+ properties: {
136
+ frame_id: {
137
+ type: 'number',
138
+ description: 'The frame ID to get OCR for',
139
+ },
140
+ },
141
+ required: ['frame_id'],
142
+ },
143
+ },
144
+ {
145
+ name: 'list_audio_devices',
146
+ description: `List all audio devices being recorded by screenpipe.
147
+ Useful to understand what audio sources are available.`,
148
+ inputSchema: {
149
+ type: 'object',
150
+ properties: {},
151
+ },
152
+ },
153
+ {
154
+ name: 'list_monitors',
155
+ description: `List all monitors being recorded by screenpipe.
156
+ Useful to understand what screens are being captured.`,
157
+ inputSchema: {
158
+ type: 'object',
159
+ properties: {},
160
+ },
161
+ },
162
+ {
163
+ name: 'health_check',
164
+ description: `Check if screenpipe is running and accessible.
165
+ Use this to verify the connection before performing other operations.`,
166
+ inputSchema: {
167
+ type: 'object',
168
+ properties: {},
169
+ },
170
+ },
171
+ ];
172
+ async function handleSearchScreenContent(args) {
173
+ const params = new URLSearchParams();
174
+ if (args.query)
175
+ params.set('q', String(args.query));
176
+ if (args.content_type)
177
+ params.set('content_type', String(args.content_type));
178
+ if (args.limit)
179
+ params.set('limit', String(args.limit));
180
+ if (args.offset)
181
+ params.set('offset', String(args.offset));
182
+ if (args.start_time)
183
+ params.set('start_time', String(args.start_time));
184
+ if (args.end_time)
185
+ params.set('end_time', String(args.end_time));
186
+ if (args.app_name)
187
+ params.set('app_name', String(args.app_name));
188
+ if (args.window_name)
189
+ params.set('window_name', String(args.window_name));
190
+ const result = await screenpipeGet('/search', params);
191
+ if (!result.data || result.data.length === 0) {
192
+ return 'No results found.';
193
+ }
194
+ return formatSearchResults(result.data);
195
+ }
196
+ async function handleGetRecentContext(args) {
197
+ const minutes = Number(args.minutes) || 5;
198
+ const endTime = new Date();
199
+ const startTime = new Date(endTime.getTime() - minutes * 60 * 1000);
200
+ const params = new URLSearchParams();
201
+ params.set('start_time', startTime.toISOString());
202
+ params.set('end_time', endTime.toISOString());
203
+ params.set('limit', String(args.limit || 20));
204
+ if (args.content_type)
205
+ params.set('content_type', String(args.content_type));
206
+ const result = await screenpipeGet('/search', params);
207
+ if (!result.data || result.data.length === 0) {
208
+ return `No activity found in the last ${minutes} minutes.`;
209
+ }
210
+ return `Recent activity (last ${minutes} minutes):\n\n${formatSearchResults(result.data)}`;
211
+ }
212
+ async function handleGetFrame(args) {
213
+ const frameId = Number(args.frame_id);
214
+ const result = await screenpipeGet(`/frames/${frameId}`);
215
+ if (!result.data) {
216
+ return `Frame ${frameId} not found.`;
217
+ }
218
+ const frame = result.data;
219
+ let output = `Frame #${frameId}:\n`;
220
+ output += `- Timestamp: ${frame.timestamp}\n`;
221
+ output += `- App: ${frame.app_name}\n`;
222
+ output += `- Window: ${frame.window_name}\n`;
223
+ if (args.include_image && frame.image) {
224
+ output += `- Image: [base64 data available]\n`;
225
+ }
226
+ return output;
227
+ }
228
+ async function handleGetFrameOcr(args) {
229
+ const frameId = Number(args.frame_id);
230
+ const result = await screenpipeGet(`/frames/${frameId}/ocr`);
231
+ if (!result.data) {
232
+ return `No OCR data found for frame ${frameId}.`;
233
+ }
234
+ return `OCR for Frame #${frameId}:\n\n${result.data.text || '(no text detected)'}`;
235
+ }
236
+ async function handleListAudioDevices() {
237
+ const result = await screenpipeGet('/audio/devices');
238
+ if (!result.data || result.data.length === 0) {
239
+ return 'No audio devices found.';
240
+ }
241
+ return result.data
242
+ .map((d) => `- ${d.name}${d.is_default ? ' (default)' : ''}`)
243
+ .join('\n');
244
+ }
245
+ async function handleListMonitors() {
246
+ const result = await screenpipeGet('/monitors');
247
+ if (!result.data || result.data.length === 0) {
248
+ return 'No monitors found.';
249
+ }
250
+ return result.data.map((m) => `- Monitor ${m.id}: ${m.name}`).join('\n');
251
+ }
252
+ async function handleHealthCheck() {
253
+ const isHealthy = await checkScreenpipeHealth();
254
+ if (isHealthy) {
255
+ return `Screenpipe is running and accessible at ${SCREENPIPE_API_URL}`;
256
+ }
257
+ else {
258
+ return `Screenpipe is NOT accessible at ${SCREENPIPE_API_URL}. Please make sure screenpipe is running.`;
259
+ }
260
+ }
261
+ // ==================== Helpers ====================
262
+ function formatSearchResults(results) {
263
+ return results
264
+ .map((r, i) => {
265
+ const c = r.content;
266
+ if (r.type === 'OCR') {
267
+ return `[${i + 1}] SCREEN (${c.timestamp})\n App: ${c.app_name} | Window: ${c.window_name}\n Text: ${truncate(String(c.text || ''), 200)}`;
268
+ }
269
+ else if (r.type === 'Audio') {
270
+ return `[${i + 1}] AUDIO (${c.timestamp})\n Device: ${c.device_name || c.device}\n Transcription: ${truncate(String(c.transcription || ''), 200)}`;
271
+ }
272
+ else {
273
+ return `[${i + 1}] UI (${c.timestamp})\n App: ${c.app_name} | Window: ${c.window_name}\n Text: ${truncate(String(c.text || ''), 200)}`;
274
+ }
275
+ })
276
+ .join('\n\n');
277
+ }
278
+ function truncate(str, maxLen) {
279
+ if (str.length <= maxLen)
280
+ return str;
281
+ return str.slice(0, maxLen - 3) + '...';
282
+ }
283
+ // ==================== Server Setup ====================
284
+ const server = new Server({
285
+ name: 'screencoach-mcp',
286
+ version: '0.1.0',
287
+ }, {
288
+ capabilities: {
289
+ tools: {},
290
+ },
291
+ });
292
+ // List available tools
293
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
294
+ return { tools: TOOLS };
295
+ });
296
+ // Handle tool calls
297
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
298
+ const { name, arguments: args } = request.params;
299
+ try {
300
+ let result;
301
+ switch (name) {
302
+ case 'search_screen_content':
303
+ result = await handleSearchScreenContent(args || {});
304
+ break;
305
+ case 'get_recent_context':
306
+ result = await handleGetRecentContext(args || {});
307
+ break;
308
+ case 'get_frame':
309
+ result = await handleGetFrame(args || {});
310
+ break;
311
+ case 'get_frame_ocr':
312
+ result = await handleGetFrameOcr(args || {});
313
+ break;
314
+ case 'list_audio_devices':
315
+ result = await handleListAudioDevices();
316
+ break;
317
+ case 'list_monitors':
318
+ result = await handleListMonitors();
319
+ break;
320
+ case 'health_check':
321
+ result = await handleHealthCheck();
322
+ break;
323
+ default:
324
+ return {
325
+ content: [{ type: 'text', text: `Unknown tool: ${name}` }],
326
+ isError: true,
327
+ };
328
+ }
329
+ return {
330
+ content: [{ type: 'text', text: result }],
331
+ };
332
+ }
333
+ catch (error) {
334
+ const message = error instanceof Error ? error.message : String(error);
335
+ return {
336
+ content: [{ type: 'text', text: `Error: ${message}` }],
337
+ isError: true,
338
+ };
339
+ }
340
+ });
341
+ // Start the server
342
+ async function main() {
343
+ const transport = new StdioServerTransport();
344
+ await server.connect(transport);
345
+ console.error('ScreenCoach MCP server running on stdio');
346
+ }
347
+ main().catch((error) => {
348
+ console.error('Fatal error:', error);
349
+ process.exit(1);
350
+ });
351
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "screencoach-mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for ScreenCoach - AI-powered screen context and memory assistant",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "screencoach-mcp": "./dist/index.js"
8
+ },
9
+ "type": "module",
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsx src/index.ts",
13
+ "start": "node dist/index.js",
14
+ "prepublishOnly": "npm run build"
15
+ },
16
+ "keywords": [
17
+ "mcp",
18
+ "screenpipe",
19
+ "claude",
20
+ "ai",
21
+ "screen-capture",
22
+ "memory"
23
+ ],
24
+ "author": "ScreenCoach Team",
25
+ "license": "MIT",
26
+ "dependencies": {
27
+ "@modelcontextprotocol/sdk": "^1.12.1"
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "^22.5.0",
31
+ "tsx": "^4.19.0",
32
+ "typescript": "^5.5.4"
33
+ },
34
+ "engines": {
35
+ "node": ">=18.0.0"
36
+ },
37
+ "files": [
38
+ "dist/**/*"
39
+ ]
40
+ }