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 +69 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +351 -0
- package/dist/index.js.map +1 -0
- package/package.json +40 -0
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
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
}
|