screenpipe-mcp 0.18.10 → 0.18.11

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.md ADDED
@@ -0,0 +1,90 @@
1
+ # Screenpipe Commercial License
2
+
3
+ Copyright (c) 2024-2026 Mediar, Inc. (dba Screenpipe). All rights reserved.
4
+
5
+ ## 1. Definitions
6
+
7
+ "Licensed Work" means the Screenpipe software covered by this license,
8
+ including its source code and documentation, and any binaries built from
9
+ that source code.
10
+
11
+ "Licensor" means Mediar, Inc. (dba Screenpipe).
12
+
13
+ "You" means the individual or entity exercising rights under this license.
14
+
15
+ "Commercial Use" means any use of the Licensed Work:
16
+ (a) in a business or production environment;
17
+ (b) to generate revenue or to support revenue-generating activity; or
18
+ (c) by or on behalf of a for-profit entity, after the Evaluation period.
19
+
20
+ ## 2. Free Use
21
+
22
+ You may use, copy, modify, and run the Licensed Work at no charge for:
23
+ - Personal, non-commercial use;
24
+ - Non-profit, educational, or research use;
25
+ - Evaluation, development, and testing for up to seven (7) days,
26
+ at any organization size.
27
+
28
+ ## 3. Official Builds and Subscriptions
29
+
30
+ This license governs the source code of the Licensed Work and any binaries
31
+ built from it by you or by third parties. It does not govern official
32
+ prebuilt builds of Screenpipe distributed by the Licensor. Use of official
33
+ builds is governed by the Screenpipe Terms of Service at
34
+ https://screenpi.pe/terms and by the terms of your subscription or other
35
+ app license.
36
+
37
+ For clarity: one subscription or lifetime license per person, covering
38
+ that person's own devices, including that person's own work use. Up to
39
+ four (4) individual licenses may be used within a single company; five
40
+ (5) or more users at one company require a Screenpipe Team or Enterprise
41
+ plan, regardless of who pays for the individual licenses. Machines not
42
+ tied to an individual licensed user (servers, shared or unattended
43
+ machines) require a commercial agreement with the Licensor.
44
+
45
+ ## 4. Commercial Use Requires a Paid License
46
+
47
+ Any Commercial Use of the Licensed Work requires a separate paid commercial
48
+ license from the Licensor. This applies regardless of company size,
49
+ headcount, revenue, or funding. Contact louis@screenpi.pe or visit
50
+ https://screenpi.pe/commercial-license.
51
+
52
+ ## 5. Prohibited Without a Commercial License
53
+
54
+ Without a valid commercial license you may not:
55
+ - Sell, sublicense, or distribute the Licensed Work as part of a
56
+ commercial product or service;
57
+ - Provide the Licensed Work as a hosted or managed service to third parties;
58
+ - Embed or integrate the Licensed Work into a product offered to customers;
59
+ - Use the Licensed Work to build, offer, or operate a competing product
60
+ or service.
61
+
62
+ ## 6. Ownership
63
+
64
+ The Licensor and its licensors retain all right, title, and interest in the
65
+ Licensed Work, including any modifications or patches you make. No rights are
66
+ granted except those expressly stated in this license.
67
+
68
+ ## 7. Termination
69
+
70
+ Any use outside the terms of this license terminates your rights
71
+ automatically. On termination you must cease all use and destroy all copies
72
+ in your possession.
73
+
74
+ ## 8. Warranty Disclaimer
75
+
76
+ THE LICENSED WORK IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
77
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
78
+ FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT. IN NO EVENT SHALL THE
79
+ LICENSOR BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN
80
+ ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF, OR IN
81
+ CONNECTION WITH THE LICENSED WORK OR THE USE OR OTHER DEALINGS IN THE
82
+ LICENSED WORK.
83
+
84
+ ---
85
+
86
+ This license applies to all code in this repository.
87
+
88
+ Versions of Screenpipe previously released under the MIT license remain
89
+ available under the MIT license. This license applies to this version and
90
+ all later versions of the Licensed Work.
package/README.md CHANGED
@@ -179,6 +179,7 @@ Get accessibility text, parsed tree nodes, and extracted URLs for a specific fra
179
179
  - All timestamps are handled in UTC
180
180
  - Results are formatted for readability in Claude's interface
181
181
  - macOS automation features require accessibility permissions
182
+ - The MCP tools already return compact, readable text. If you instead call the underlying screenpipe REST API directly (e.g. via `curl`), the list endpoints (`/search`, `/elements`, `/frames/{id}/elements`) accept `?format=csv|tsv` for a columnar table (column names written once) and `?fields=a,b,c` to select only the columns you need (dotted paths like `content.text`). On list-shaped results that is roughly a 70% token cut versus the default JSON, which stays unchanged when neither param is set.
182
183
 
183
184
  ## Privacy Policy
184
185
 
package/dist/index.js CHANGED
@@ -315,6 +315,10 @@ const TOOLS = [
315
315
  },
316
316
  speaker_ids: { type: "string", description: "Comma-separated speaker IDs to filter audio" },
317
317
  speaker_name: { type: "string", description: "Filter audio by speaker name (case-insensitive partial match)" },
318
+ tags: {
319
+ type: "string",
320
+ description: "Comma-separated tags; returns only items carrying ALL of them (e.g. 'person:ada,project:atlas'). Works for screen + audio (content_type 'ocr'/'audio'/'all', tags written by add-tags) AND memories (content_type 'memory', tags written by update-memory). Same tag string links across all three, so two items sharing a tag are connected. Use namespaced tags (person:, project:, topic:) to link people/projects/topics. content_type 'input' and 'accessibility' have no tags and return nothing when this is set.",
321
+ },
318
322
  max_content_length: {
319
323
  type: "integer",
320
324
  description: "Truncate each result's text via middle-truncation. Use 200-500 to keep responses compact.",
@@ -426,7 +430,7 @@ const TOOLS = [
426
430
  properties: {
427
431
  id: { type: "integer", description: "Memory ID — omit to create new, provide to update/delete" },
428
432
  content: { type: "string", description: "Memory text (required for creation)" },
429
- tags: { type: "array", items: { type: "string" }, description: "Categorization tags (e.g. ['work', 'project-x'])" },
433
+ tags: { type: "array", items: { type: "string" }, description: "Tags. Prefer namespaced (person:ada, project:atlas, topic:pricing) so this memory links to the same people/projects you tag on frames/audio. Retrieve with search-content content_type='memory' tags='person:ada'." },
430
434
  importance: { type: "number", description: "0.0 (trivial) to 1.0 (critical). Default 0.5." },
431
435
  source_context: { type: "object", description: "Optional metadata linking to source (app, timestamp, etc.)" },
432
436
  delete: { type: "boolean", description: "Set true to delete the memory identified by id" },
@@ -486,14 +490,18 @@ const TOOLS = [
486
490
  },
487
491
  {
488
492
  name: "add-tags",
489
- description: "Add tags to a content item (vision frame or audio chunk) for organization and retrieval.",
493
+ description: "Tag a screen frame (vision) or audio chunk (audio) so it can be retrieved later. " +
494
+ "Tags are a shared linking layer: use namespaced tags (person:ada, project:atlas, topic:pricing) to connect a capture to a person, project, or topic. " +
495
+ "The SAME tag string also works on memories (via update-memory), so tagging a frame and a memory with person:ada links them. " +
496
+ "Retrieve later with search-content tags='person:ada' (add content_type+start_time/end_time to scope to a timeframe). " +
497
+ "Note: frames are pruned by retention, so for durable links prefer tagging a memory; tag frames/audio for shorter-term recall.",
490
498
  annotations: { title: "Add Tags", readOnlyHint: false, destructiveHint: false, openWorldHint: false },
491
499
  inputSchema: {
492
500
  type: "object",
493
501
  properties: {
494
- content_type: { type: "string", enum: ["vision", "audio"], description: "Type of content to tag" },
495
- id: { type: "integer", description: "Content item ID" },
496
- tags: { type: "array", items: { type: "string" }, description: "Tags to add" },
502
+ content_type: { type: "string", enum: ["vision", "audio"], description: "vision = screen frame, audio = audio chunk. Get the id from search-content results (frame_id / chunk_id)." },
503
+ id: { type: "integer", description: "Content item ID (OCR result frame_id, or audio result chunk_id)" },
504
+ tags: { type: "array", items: { type: "string" }, description: "Tags to add. Prefer namespaced: person:<name>, project:<name>, topic:<name>." },
497
505
  },
498
506
  required: ["content_type", "id", "tags"],
499
507
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "screenpipe-mcp",
3
- "version": "0.18.10",
3
+ "version": "0.18.11",
4
4
  "description": "MCP server for screenpipe - search your screen recordings and audio transcriptions",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -28,7 +28,7 @@
28
28
  "audio-transcription"
29
29
  ],
30
30
  "author": "Screenpipe",
31
- "license": "MIT",
31
+ "license": "SEE LICENSE IN LICENSE.md",
32
32
  "dependencies": {
33
33
  "@modelcontextprotocol/sdk": "^1.27.1"
34
34
  },
package/src/index.ts CHANGED
@@ -302,6 +302,11 @@ const TOOLS: Tool[] = [
302
302
  },
303
303
  speaker_ids: { type: "string", description: "Comma-separated speaker IDs to filter audio" },
304
304
  speaker_name: { type: "string", description: "Filter audio by speaker name (case-insensitive partial match)" },
305
+ tags: {
306
+ type: "string",
307
+ description:
308
+ "Comma-separated tags; returns only items carrying ALL of them (e.g. 'person:ada,project:atlas'). Works for screen + audio (content_type 'ocr'/'audio'/'all', tags written by add-tags) AND memories (content_type 'memory', tags written by update-memory). Same tag string links across all three, so two items sharing a tag are connected. Use namespaced tags (person:, project:, topic:) to link people/projects/topics. content_type 'input' and 'accessibility' have no tags and return nothing when this is set.",
309
+ },
305
310
  max_content_length: {
306
311
  type: "integer",
307
312
  description: "Truncate each result's text via middle-truncation. Use 200-500 to keep responses compact.",
@@ -420,7 +425,7 @@ const TOOLS: Tool[] = [
420
425
  properties: {
421
426
  id: { type: "integer", description: "Memory ID — omit to create new, provide to update/delete" },
422
427
  content: { type: "string", description: "Memory text (required for creation)" },
423
- tags: { type: "array", items: { type: "string" }, description: "Categorization tags (e.g. ['work', 'project-x'])" },
428
+ tags: { type: "array", items: { type: "string" }, description: "Tags. Prefer namespaced (person:ada, project:atlas, topic:pricing) so this memory links to the same people/projects you tag on frames/audio. Retrieve with search-content content_type='memory' tags='person:ada'." },
424
429
  importance: { type: "number", description: "0.0 (trivial) to 1.0 (critical). Default 0.5." },
425
430
  source_context: { type: "object", description: "Optional metadata linking to source (app, timestamp, etc.)" },
426
431
  delete: { type: "boolean", description: "Set true to delete the memory identified by id" },
@@ -483,14 +488,18 @@ const TOOLS: Tool[] = [
483
488
  {
484
489
  name: "add-tags",
485
490
  description:
486
- "Add tags to a content item (vision frame or audio chunk) for organization and retrieval.",
491
+ "Tag a screen frame (vision) or audio chunk (audio) so it can be retrieved later. " +
492
+ "Tags are a shared linking layer: use namespaced tags (person:ada, project:atlas, topic:pricing) to connect a capture to a person, project, or topic. " +
493
+ "The SAME tag string also works on memories (via update-memory), so tagging a frame and a memory with person:ada links them. " +
494
+ "Retrieve later with search-content tags='person:ada' (add content_type+start_time/end_time to scope to a timeframe). " +
495
+ "Note: frames are pruned by retention, so for durable links prefer tagging a memory; tag frames/audio for shorter-term recall.",
487
496
  annotations: { title: "Add Tags", readOnlyHint: false, destructiveHint: false, openWorldHint: false },
488
497
  inputSchema: {
489
498
  type: "object",
490
499
  properties: {
491
- content_type: { type: "string", enum: ["vision", "audio"], description: "Type of content to tag" },
492
- id: { type: "integer", description: "Content item ID" },
493
- tags: { type: "array", items: { type: "string" }, description: "Tags to add" },
500
+ content_type: { type: "string", enum: ["vision", "audio"], description: "vision = screen frame, audio = audio chunk. Get the id from search-content results (frame_id / chunk_id)." },
501
+ id: { type: "integer", description: "Content item ID (OCR result frame_id, or audio result chunk_id)" },
502
+ tags: { type: "array", items: { type: "string" }, description: "Tags to add. Prefer namespaced: person:<name>, project:<name>, topic:<name>." },
494
503
  },
495
504
  required: ["content_type", "id", "tags"],
496
505
  },