screenpipe-mcp 0.20.0 → 0.20.2
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 +34 -1
- package/RELEASE.md +24 -8
- package/bun.lock +105 -1
- package/dist/cli.js +44 -38
- package/dist/http-server.js +44 -38
- package/dist/index.js +42 -38
- package/manifest.json +41 -6
- package/package.json +6 -3
- package/plugins/screenpipe-cloud/README.md +65 -0
- package/plugins/screenpipe-cloud/SUBMISSION.md +74 -0
- package/plugins/screenpipe-cloud/mcp.json +9 -0
- package/plugins/screenpipe-cloud/plugin.json +34 -0
- package/scripts/build-installers.mjs +75 -0
- package/server.json +2 -2
- package/src/http-server.test.ts +61 -0
- package/src/http-server.ts +2 -0
- package/src/installers.test.ts +143 -0
- package/src/qualified-value.test.ts +1 -0
- package/src/qualified-value.ts +1 -1
package/dist/index.js
CHANGED
|
@@ -75,7 +75,7 @@ var __esm = (fn, res, err) => () => {
|
|
|
75
75
|
return res;
|
|
76
76
|
};
|
|
77
77
|
|
|
78
|
-
// node_modules/zod/v4/core/core.js
|
|
78
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/core/core.js
|
|
79
79
|
function $constructor(name, initializer, params) {
|
|
80
80
|
function init(inst, def) {
|
|
81
81
|
if (!inst._zod) {
|
|
@@ -153,7 +153,7 @@ var init_core = __esm(() => {
|
|
|
153
153
|
globalConfig = {};
|
|
154
154
|
});
|
|
155
155
|
|
|
156
|
-
// node_modules/zod/v4/core/util.js
|
|
156
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/core/util.js
|
|
157
157
|
function getEnumValues(entries) {
|
|
158
158
|
const numericValues = Object.values(entries).filter((v) => typeof v === "number");
|
|
159
159
|
const values = Object.entries(entries).filter(([k, _]) => numericValues.indexOf(+k) === -1).map(([_, v]) => v);
|
|
@@ -579,7 +579,7 @@ var init_util = __esm(() => {
|
|
|
579
579
|
};
|
|
580
580
|
});
|
|
581
581
|
|
|
582
|
-
// node_modules/zod/v4/core/errors.js
|
|
582
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/core/errors.js
|
|
583
583
|
function flattenError(error, mapper = (issue) => issue.message) {
|
|
584
584
|
const fieldErrors = {};
|
|
585
585
|
const formErrors = [];
|
|
@@ -649,7 +649,7 @@ var init_errors = __esm(() => {
|
|
|
649
649
|
$ZodRealError = $constructor("$ZodError", initializer, { Parent: Error });
|
|
650
650
|
});
|
|
651
651
|
|
|
652
|
-
// node_modules/zod/v4/core/parse.js
|
|
652
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/core/parse.js
|
|
653
653
|
var _parse = (_Err) => (schema, value, _ctx, _params) => {
|
|
654
654
|
const ctx = _ctx ? Object.assign(_ctx, { async: false }) : { async: false };
|
|
655
655
|
const result = schema._zod.run({ value, issues: [] }, ctx);
|
|
@@ -721,7 +721,7 @@ var init_parse = __esm(() => {
|
|
|
721
721
|
safeParseAsync = /* @__PURE__ */ _safeParseAsync($ZodRealError);
|
|
722
722
|
});
|
|
723
723
|
|
|
724
|
-
// node_modules/zod/v4/core/regexes.js
|
|
724
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/core/regexes.js
|
|
725
725
|
function emoji() {
|
|
726
726
|
return new RegExp(_emoji, "u");
|
|
727
727
|
}
|
|
@@ -777,7 +777,7 @@ var init_regexes = __esm(() => {
|
|
|
777
777
|
uppercase = /^[^a-z]*$/;
|
|
778
778
|
});
|
|
779
779
|
|
|
780
|
-
// node_modules/zod/v4/core/checks.js
|
|
780
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/core/checks.js
|
|
781
781
|
var $ZodCheck, numericOriginMap, $ZodCheckLessThan, $ZodCheckGreaterThan, $ZodCheckMultipleOf, $ZodCheckNumberFormat, $ZodCheckMaxLength, $ZodCheckMinLength, $ZodCheckLengthEquals, $ZodCheckStringFormat, $ZodCheckRegex, $ZodCheckLowerCase, $ZodCheckUpperCase, $ZodCheckIncludes, $ZodCheckStartsWith, $ZodCheckEndsWith, $ZodCheckOverwrite;
|
|
782
782
|
var init_checks = __esm(() => {
|
|
783
783
|
init_core();
|
|
@@ -1172,7 +1172,7 @@ var init_checks = __esm(() => {
|
|
|
1172
1172
|
});
|
|
1173
1173
|
});
|
|
1174
1174
|
|
|
1175
|
-
// node_modules/zod/v4/core/doc.js
|
|
1175
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/core/doc.js
|
|
1176
1176
|
class Doc {
|
|
1177
1177
|
constructor(args = []) {
|
|
1178
1178
|
this.content = [];
|
|
@@ -1210,7 +1210,7 @@ class Doc {
|
|
|
1210
1210
|
}
|
|
1211
1211
|
}
|
|
1212
1212
|
|
|
1213
|
-
// node_modules/zod/v4/core/versions.js
|
|
1213
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/core/versions.js
|
|
1214
1214
|
var version;
|
|
1215
1215
|
var init_versions = __esm(() => {
|
|
1216
1216
|
version = {
|
|
@@ -1220,7 +1220,7 @@ var init_versions = __esm(() => {
|
|
|
1220
1220
|
};
|
|
1221
1221
|
});
|
|
1222
1222
|
|
|
1223
|
-
// node_modules/zod/v4/core/schemas.js
|
|
1223
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/core/schemas.js
|
|
1224
1224
|
function isValidBase64(data) {
|
|
1225
1225
|
if (data === "")
|
|
1226
1226
|
return true;
|
|
@@ -2616,7 +2616,7 @@ var init_schemas = __esm(() => {
|
|
|
2616
2616
|
});
|
|
2617
2617
|
});
|
|
2618
2618
|
|
|
2619
|
-
// node_modules/zod/v4/locales/en.js
|
|
2619
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/locales/en.js
|
|
2620
2620
|
function en_default() {
|
|
2621
2621
|
return {
|
|
2622
2622
|
localeError: error()
|
|
@@ -2726,10 +2726,10 @@ var init_en = __esm(() => {
|
|
|
2726
2726
|
init_util();
|
|
2727
2727
|
});
|
|
2728
2728
|
|
|
2729
|
-
// node_modules/zod/v4/locales/index.js
|
|
2729
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/locales/index.js
|
|
2730
2730
|
var init_locales = () => {};
|
|
2731
2731
|
|
|
2732
|
-
// node_modules/zod/v4/core/registries.js
|
|
2732
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/core/registries.js
|
|
2733
2733
|
class $ZodRegistry {
|
|
2734
2734
|
constructor() {
|
|
2735
2735
|
this._map = new WeakMap;
|
|
@@ -2781,7 +2781,7 @@ var init_registries = __esm(() => {
|
|
|
2781
2781
|
globalRegistry = globalThis.__zod_globalRegistry;
|
|
2782
2782
|
});
|
|
2783
2783
|
|
|
2784
|
-
// node_modules/zod/v4/core/api.js
|
|
2784
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/core/api.js
|
|
2785
2785
|
function _string(Class, params) {
|
|
2786
2786
|
return new Class({
|
|
2787
2787
|
type: "string",
|
|
@@ -3252,7 +3252,7 @@ var init_api = __esm(() => {
|
|
|
3252
3252
|
init_util();
|
|
3253
3253
|
});
|
|
3254
3254
|
|
|
3255
|
-
// node_modules/zod/v4/core/to-json-schema.js
|
|
3255
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/core/to-json-schema.js
|
|
3256
3256
|
function initializeContext(params) {
|
|
3257
3257
|
let target = params?.target ?? "draft-2020-12";
|
|
3258
3258
|
if (target === "draft-4")
|
|
@@ -3600,7 +3600,7 @@ var init_to_json_schema = __esm(() => {
|
|
|
3600
3600
|
init_registries();
|
|
3601
3601
|
});
|
|
3602
3602
|
|
|
3603
|
-
// node_modules/zod/v4/core/json-schema-processors.js
|
|
3603
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/core/json-schema-processors.js
|
|
3604
3604
|
var formatMap, stringProcessor = (schema, ctx, _json, _params) => {
|
|
3605
3605
|
const json = _json;
|
|
3606
3606
|
json.type = "string";
|
|
@@ -3918,10 +3918,10 @@ var init_json_schema_processors = __esm(() => {
|
|
|
3918
3918
|
};
|
|
3919
3919
|
});
|
|
3920
3920
|
|
|
3921
|
-
// node_modules/zod/v4/core/json-schema.js
|
|
3921
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/core/json-schema.js
|
|
3922
3922
|
var init_json_schema = () => {};
|
|
3923
3923
|
|
|
3924
|
-
// node_modules/zod/v4/core/index.js
|
|
3924
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/core/index.js
|
|
3925
3925
|
var init_core2 = __esm(() => {
|
|
3926
3926
|
init_util();
|
|
3927
3927
|
init_regexes();
|
|
@@ -3938,24 +3938,24 @@ var init_core2 = __esm(() => {
|
|
|
3938
3938
|
init_to_json_schema();
|
|
3939
3939
|
});
|
|
3940
3940
|
|
|
3941
|
-
// node_modules/zod/v4/mini/parse.js
|
|
3941
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/mini/parse.js
|
|
3942
3942
|
var init_parse2 = __esm(() => {
|
|
3943
3943
|
init_core2();
|
|
3944
3944
|
});
|
|
3945
3945
|
|
|
3946
|
-
// node_modules/zod/v4/mini/schemas.js
|
|
3946
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/mini/schemas.js
|
|
3947
3947
|
var init_schemas2 = () => {};
|
|
3948
3948
|
|
|
3949
|
-
// node_modules/zod/v4/mini/checks.js
|
|
3949
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/mini/checks.js
|
|
3950
3950
|
var init_checks2 = () => {};
|
|
3951
3951
|
|
|
3952
|
-
// node_modules/zod/v4/mini/iso.js
|
|
3952
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/mini/iso.js
|
|
3953
3953
|
var init_iso = () => {};
|
|
3954
3954
|
|
|
3955
|
-
// node_modules/zod/v4/mini/coerce.js
|
|
3955
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/mini/coerce.js
|
|
3956
3956
|
var init_coerce = () => {};
|
|
3957
3957
|
|
|
3958
|
-
// node_modules/zod/v4/mini/external.js
|
|
3958
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/mini/external.js
|
|
3959
3959
|
var init_external = __esm(() => {
|
|
3960
3960
|
init_core2();
|
|
3961
3961
|
init_locales();
|
|
@@ -3966,12 +3966,12 @@ var init_external = __esm(() => {
|
|
|
3966
3966
|
init_checks2();
|
|
3967
3967
|
});
|
|
3968
3968
|
|
|
3969
|
-
// node_modules/zod/v4/mini/index.js
|
|
3969
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/mini/index.js
|
|
3970
3970
|
var init_mini = __esm(() => {
|
|
3971
3971
|
init_external();
|
|
3972
3972
|
});
|
|
3973
3973
|
|
|
3974
|
-
// node_modules/zod/v4-mini/index.js
|
|
3974
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4-mini/index.js
|
|
3975
3975
|
var init_v4_mini = __esm(() => {
|
|
3976
3976
|
init_mini();
|
|
3977
3977
|
});
|
|
@@ -4042,12 +4042,12 @@ var init_zod_compat = __esm(() => {
|
|
|
4042
4042
|
init_v4_mini();
|
|
4043
4043
|
});
|
|
4044
4044
|
|
|
4045
|
-
// node_modules/zod/v4/classic/checks.js
|
|
4045
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/classic/checks.js
|
|
4046
4046
|
var init_checks3 = __esm(() => {
|
|
4047
4047
|
init_core2();
|
|
4048
4048
|
});
|
|
4049
4049
|
|
|
4050
|
-
// node_modules/zod/v4/classic/iso.js
|
|
4050
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/classic/iso.js
|
|
4051
4051
|
function datetime2(params) {
|
|
4052
4052
|
return _isoDateTime(ZodISODateTime, params);
|
|
4053
4053
|
}
|
|
@@ -4082,7 +4082,7 @@ var init_iso2 = __esm(() => {
|
|
|
4082
4082
|
});
|
|
4083
4083
|
});
|
|
4084
4084
|
|
|
4085
|
-
// node_modules/zod/v4/classic/errors.js
|
|
4085
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/classic/errors.js
|
|
4086
4086
|
var initializer2 = (inst, issues) => {
|
|
4087
4087
|
$ZodError.init(inst, issues);
|
|
4088
4088
|
inst.name = "ZodError";
|
|
@@ -4122,7 +4122,7 @@ var init_errors2 = __esm(() => {
|
|
|
4122
4122
|
});
|
|
4123
4123
|
});
|
|
4124
4124
|
|
|
4125
|
-
// node_modules/zod/v4/classic/parse.js
|
|
4125
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/classic/parse.js
|
|
4126
4126
|
var parse4, parseAsync2, safeParse3, safeParseAsync2, encode2, decode2, encodeAsync2, decodeAsync2, safeEncode2, safeDecode2, safeEncodeAsync2, safeDecodeAsync2;
|
|
4127
4127
|
var init_parse3 = __esm(() => {
|
|
4128
4128
|
init_core2();
|
|
@@ -4141,7 +4141,7 @@ var init_parse3 = __esm(() => {
|
|
|
4141
4141
|
safeDecodeAsync2 = /* @__PURE__ */ _safeDecodeAsync(ZodRealError);
|
|
4142
4142
|
});
|
|
4143
4143
|
|
|
4144
|
-
// node_modules/zod/v4/classic/schemas.js
|
|
4144
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/classic/schemas.js
|
|
4145
4145
|
function string2(params) {
|
|
4146
4146
|
return _string(ZodString, params);
|
|
4147
4147
|
}
|
|
@@ -4791,16 +4791,16 @@ var init_schemas3 = __esm(() => {
|
|
|
4791
4791
|
});
|
|
4792
4792
|
});
|
|
4793
4793
|
|
|
4794
|
-
// node_modules/zod/v4/classic/compat.js
|
|
4794
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/classic/compat.js
|
|
4795
4795
|
var ZodFirstPartyTypeKind;
|
|
4796
4796
|
var init_compat = __esm(() => {
|
|
4797
4797
|
(function(ZodFirstPartyTypeKind) {})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));
|
|
4798
4798
|
});
|
|
4799
4799
|
|
|
4800
|
-
// node_modules/zod/v4/classic/coerce.js
|
|
4800
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/classic/coerce.js
|
|
4801
4801
|
var init_coerce2 = () => {};
|
|
4802
4802
|
|
|
4803
|
-
// node_modules/zod/v4/classic/external.js
|
|
4803
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/classic/external.js
|
|
4804
4804
|
var init_external2 = __esm(() => {
|
|
4805
4805
|
init_core2();
|
|
4806
4806
|
init_core2();
|
|
@@ -4816,12 +4816,12 @@ var init_external2 = __esm(() => {
|
|
|
4816
4816
|
config(en_default());
|
|
4817
4817
|
});
|
|
4818
4818
|
|
|
4819
|
-
// node_modules/zod/v4/classic/index.js
|
|
4819
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/classic/index.js
|
|
4820
4820
|
var init_classic = __esm(() => {
|
|
4821
4821
|
init_external2();
|
|
4822
4822
|
});
|
|
4823
4823
|
|
|
4824
|
-
// node_modules/zod/v4/index.js
|
|
4824
|
+
// node_modules/@modelcontextprotocol/sdk/node_modules/zod/v4/index.js
|
|
4825
4825
|
var init_v4 = __esm(() => {
|
|
4826
4826
|
init_classic();
|
|
4827
4827
|
});
|
|
@@ -48678,7 +48678,7 @@ var init_esm6 = __esm(() => {
|
|
|
48678
48678
|
var require_package = __commonJS(function(exports2, module2) {
|
|
48679
48679
|
module2.exports = {
|
|
48680
48680
|
name: "screenpipe-mcp",
|
|
48681
|
-
version: "0.20.
|
|
48681
|
+
version: "0.20.2",
|
|
48682
48682
|
mcpName: "io.github.screenpipe/screenpipe-mcp",
|
|
48683
48683
|
description: "MCP server for screenpipe - search your screen recordings and audio transcriptions",
|
|
48684
48684
|
main: "dist/index.js",
|
|
@@ -48696,7 +48696,8 @@ var require_package = __commonJS(function(exports2, module2) {
|
|
|
48696
48696
|
test: "vitest run",
|
|
48697
48697
|
"test:watch": "vitest",
|
|
48698
48698
|
"verify:pack": "node scripts/assert-pack-contents.js",
|
|
48699
|
-
prepublishOnly: "npm run build"
|
|
48699
|
+
prepublishOnly: "npm run build",
|
|
48700
|
+
"build:installers": "bun scripts/build-installers.mjs"
|
|
48700
48701
|
},
|
|
48701
48702
|
keywords: [
|
|
48702
48703
|
"mcp",
|
|
@@ -48711,11 +48712,13 @@ var require_package = __commonJS(function(exports2, module2) {
|
|
|
48711
48712
|
author: "Screenpipe",
|
|
48712
48713
|
license: "SEE LICENSE IN LICENSE.md",
|
|
48713
48714
|
devDependencies: {
|
|
48715
|
+
"@anthropic-ai/mcpb": "2.1.2",
|
|
48714
48716
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
48715
48717
|
"@sentry/node": "^10.64.0",
|
|
48716
48718
|
"@types/node": "^25.3.5",
|
|
48717
|
-
|
|
48719
|
+
fflate: "0.8.2",
|
|
48718
48720
|
"ts-node": "^10.9.2",
|
|
48721
|
+
typescript: "^5.9.3",
|
|
48719
48722
|
vitest: "^4.0.18"
|
|
48720
48723
|
},
|
|
48721
48724
|
engines: {
|
|
@@ -48948,6 +48951,7 @@ var init_qualified_value = __esm(() => {
|
|
|
48948
48951
|
"hermes",
|
|
48949
48952
|
"runner",
|
|
48950
48953
|
"windsurf",
|
|
48954
|
+
"vscode",
|
|
48951
48955
|
"grok",
|
|
48952
48956
|
"grokbot"
|
|
48953
48957
|
];
|
package/manifest.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"manifest_version": "0.3",
|
|
3
3
|
"name": "screenpipe",
|
|
4
|
-
"display_name": "Screenpipe",
|
|
4
|
+
"display_name": "Screenpipe Local",
|
|
5
5
|
"version": "0.0.0-injected-from-package-json",
|
|
6
6
|
"description": "Search your screen recordings and audio transcriptions with AI",
|
|
7
|
-
"long_description": "Screenpipe
|
|
7
|
+
"long_description": "Connect Claude Desktop to Screenpipe running on this computer. Search recordings and audio, retrieve meeting notes, and use the tools exposed by your local Screenpipe server. Requested results are shared with Claude. This local extension does not require Data Sync.",
|
|
8
8
|
"author": {
|
|
9
9
|
"name": "screenpipe",
|
|
10
10
|
"url": "https://screenpi.pe"
|
|
@@ -22,7 +22,14 @@
|
|
|
22
22
|
"entry_point": "dist/index.js",
|
|
23
23
|
"mcp_config": {
|
|
24
24
|
"command": "node",
|
|
25
|
-
"args": [
|
|
25
|
+
"args": [
|
|
26
|
+
"${__dirname}/dist/index.js"
|
|
27
|
+
],
|
|
28
|
+
"env": {
|
|
29
|
+
"SCREENPIPE_API_URL": "${user_config.api_url}",
|
|
30
|
+
"SCREENPIPE_LOCAL_API_KEY": "${user_config.api_key}",
|
|
31
|
+
"SCREENPIPE_MCP_CLIENT": "claude"
|
|
32
|
+
}
|
|
26
33
|
}
|
|
27
34
|
},
|
|
28
35
|
"tools": [
|
|
@@ -52,14 +59,42 @@
|
|
|
52
59
|
}
|
|
53
60
|
],
|
|
54
61
|
"compatibility": {
|
|
55
|
-
"platforms": [
|
|
62
|
+
"platforms": [
|
|
63
|
+
"darwin",
|
|
64
|
+
"win32",
|
|
65
|
+
"linux"
|
|
66
|
+
],
|
|
56
67
|
"runtimes": {
|
|
57
68
|
"node": ">=18.0.0"
|
|
58
69
|
}
|
|
59
70
|
},
|
|
60
|
-
"keywords": [
|
|
71
|
+
"keywords": [
|
|
72
|
+
"screen-recording",
|
|
73
|
+
"ocr",
|
|
74
|
+
"audio-transcription",
|
|
75
|
+
"automation",
|
|
76
|
+
"memory",
|
|
77
|
+
"search"
|
|
78
|
+
],
|
|
61
79
|
"privacy_policies": [
|
|
62
80
|
"https://github.com/screenpipe/screenpipe/tree/main/packages/screenpipe-mcp#privacy-policy",
|
|
63
81
|
"https://screenpi.pe/privacy"
|
|
64
|
-
]
|
|
82
|
+
],
|
|
83
|
+
"tools_generated": true,
|
|
84
|
+
"user_config": {
|
|
85
|
+
"api_url": {
|
|
86
|
+
"type": "string",
|
|
87
|
+
"title": "Screenpipe API URL",
|
|
88
|
+
"description": "Local Screenpipe API address. Keep the default unless you changed its port.",
|
|
89
|
+
"default": "http://127.0.0.1:3030",
|
|
90
|
+
"required": false
|
|
91
|
+
},
|
|
92
|
+
"api_key": {
|
|
93
|
+
"type": "string",
|
|
94
|
+
"title": "Local API key (optional)",
|
|
95
|
+
"description": "Leave blank to discover it through the Screenpipe CLI. If authentication fails, use the key returned by screenpipe auth token.",
|
|
96
|
+
"sensitive": true,
|
|
97
|
+
"required": false
|
|
98
|
+
}
|
|
99
|
+
}
|
|
65
100
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "screenpipe-mcp",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.2",
|
|
4
4
|
"mcpName": "io.github.screenpipe/screenpipe-mcp",
|
|
5
5
|
"description": "MCP server for screenpipe - search your screen recordings and audio transcriptions",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -18,7 +18,8 @@
|
|
|
18
18
|
"test": "vitest run",
|
|
19
19
|
"test:watch": "vitest",
|
|
20
20
|
"verify:pack": "node scripts/assert-pack-contents.js",
|
|
21
|
-
"prepublishOnly": "npm run build"
|
|
21
|
+
"prepublishOnly": "npm run build",
|
|
22
|
+
"build:installers": "bun scripts/build-installers.mjs"
|
|
22
23
|
},
|
|
23
24
|
"keywords": [
|
|
24
25
|
"mcp",
|
|
@@ -33,11 +34,13 @@
|
|
|
33
34
|
"author": "Screenpipe",
|
|
34
35
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
35
36
|
"devDependencies": {
|
|
37
|
+
"@anthropic-ai/mcpb": "2.1.2",
|
|
36
38
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
37
39
|
"@sentry/node": "^10.64.0",
|
|
38
40
|
"@types/node": "^25.3.5",
|
|
39
|
-
"
|
|
41
|
+
"fflate": "0.8.2",
|
|
40
42
|
"ts-node": "^10.9.2",
|
|
43
|
+
"typescript": "^5.9.3",
|
|
41
44
|
"vitest": "^4.0.18"
|
|
42
45
|
},
|
|
43
46
|
"engines": {
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Screenpipe Cloud
|
|
2
|
+
|
|
3
|
+
Search your synced screen content, audio transcriptions, app data, and memories
|
|
4
|
+
across Screenpipe devices. Requires a Screenpipe account with Data Sync available
|
|
5
|
+
and enabled. Only records already synced to that account are searchable.
|
|
6
|
+
|
|
7
|
+
This cloud connector provides `synced-devices` and `search-synced-content`.
|
|
8
|
+
It does not expose local-only recordings, desktop control, or enterprise team
|
|
9
|
+
records. Signing in does not enable Data Sync or start uploading recordings.
|
|
10
|
+
|
|
11
|
+
## ChatGPT
|
|
12
|
+
|
|
13
|
+
For a private developer connection, enable Developer mode if permitted by your
|
|
14
|
+
account/workspace, open [Plugins](https://chatgpt.com/plugins), select the plus
|
|
15
|
+
button, and connect this HTTPS MCP endpoint:
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
https://screenpipe.com/api/user/data-sync/mcp
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Complete Screenpipe's OAuth sign-in and review the tools. Use a new conversation
|
|
22
|
+
to ask which devices have synced recently. An empty device list does not mean
|
|
23
|
+
the connector can see local-only recordings.
|
|
24
|
+
|
|
25
|
+
The ZIP is a portable plugin package for local plugin hosts and private testing.
|
|
26
|
+
It is not a public ChatGPT listing. Public installation from the directory
|
|
27
|
+
requires a **With MCP** submission and platform review; submit the endpoint,
|
|
28
|
+
not a localhost URL or the Claude Desktop `.mcpb` file.
|
|
29
|
+
|
|
30
|
+
## Claude
|
|
31
|
+
|
|
32
|
+
In Claude's connector settings, add a custom remote connector with the same
|
|
33
|
+
HTTPS URL and complete OAuth sign-in. Availability depends on workspace policy.
|
|
34
|
+
The ZIP also includes `.claude-plugin/plugin.json` and `.mcp.json` for Claude
|
|
35
|
+
plugin hosts. For Claude Code local development, unzip it and run:
|
|
36
|
+
|
|
37
|
+
```sh
|
|
38
|
+
claude --plugin-dir /absolute/path/to/screenpipe-cloud
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Use `/mcp` to finish authentication. No API token belongs in the archive.
|
|
42
|
+
|
|
43
|
+
For recordings that stay on your computer, use the separate
|
|
44
|
+
`screenpipe-local.mcpb` installer in Claude Desktop instead. Install it through
|
|
45
|
+
Settings → Extensions → Advanced settings → Install Extension, then select the
|
|
46
|
+
file. Keep Screenpipe running. Its optional local API key field is stored by
|
|
47
|
+
the host as a sensitive setting; if blank, the existing Screenpipe CLI discovery
|
|
48
|
+
path is used. Do not enable both local connection methods under the same server
|
|
49
|
+
name.
|
|
50
|
+
|
|
51
|
+
## Privacy and support
|
|
52
|
+
|
|
53
|
+
The cloud connector reads records already uploaded through Data Sync. Results
|
|
54
|
+
you request are sent to the connected AI provider. Its OAuth scope is
|
|
55
|
+
`data-sync:read`; it has no write tools. Disconnect it in your AI client's
|
|
56
|
+
settings when you no longer want access.
|
|
57
|
+
|
|
58
|
+
[Privacy](https://screenpipe.com/privacy) ·
|
|
59
|
+
[Terms](https://screenpipe.com/terms) ·
|
|
60
|
+
[Support](https://github.com/screenpipe/screenpipe/issues)
|
|
61
|
+
|
|
62
|
+
Packaging references:
|
|
63
|
+
[OpenAI](https://developers.openai.com/plugins/build/plugins),
|
|
64
|
+
[Claude plugins](https://code.claude.com/docs/en/plugins-reference),
|
|
65
|
+
[Claude Desktop bundles](https://github.com/anthropics/mcpb).
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Screenpipe Cloud submission handoff
|
|
2
|
+
|
|
3
|
+
Prepared package, not a submitted or approved directory listing. Authenticated
|
|
4
|
+
tool calls and real ChatGPT/Claude installation must pass before submission.
|
|
5
|
+
|
|
6
|
+
## Listing
|
|
7
|
+
|
|
8
|
+
- Name: Screenpipe Cloud
|
|
9
|
+
- Publisher: Screenpipe
|
|
10
|
+
- Category: Productivity
|
|
11
|
+
- Short description: Search your synced screen and audio history
|
|
12
|
+
- Description: Find recorded screen content, audio transcriptions, app data, and memories synced from your Screenpipe devices. Requires a Screenpipe account with Data Sync available and enabled. Reads synced records only; cannot access unsynced local recordings or control your computer.
|
|
13
|
+
- Website: https://screenpipe.com
|
|
14
|
+
- Support: https://github.com/screenpipe/screenpipe/issues
|
|
15
|
+
- Privacy: https://screenpipe.com/privacy
|
|
16
|
+
- Terms: https://screenpipe.com/terms
|
|
17
|
+
- Logo: `screenpipe-cloud/assets/icon.png` inside the generated installers directory
|
|
18
|
+
- Release notes: Initial read-only Data Sync connector with device listing and cross-device search.
|
|
19
|
+
|
|
20
|
+
## Connection
|
|
21
|
+
|
|
22
|
+
- Type: remote MCP, Streamable HTTP
|
|
23
|
+
- Endpoint: `https://screenpipe.com/api/user/data-sync/mcp`
|
|
24
|
+
- Authentication: OAuth with PKCE S256 and dynamic client registration
|
|
25
|
+
- Scope: `data-sync:read`
|
|
26
|
+
- Protected resource metadata: `https://screenpipe.com/.well-known/oauth-protected-resource/api/user/data-sync/mcp`
|
|
27
|
+
- Authorization server: `https://clerk.screenpipe.com`
|
|
28
|
+
- Tools: `synced-devices`, `search-synced-content`
|
|
29
|
+
- Both tools: `readOnlyHint=true`, `destructiveHint=false`, `idempotentHint=true`, `openWorldHint=true`
|
|
30
|
+
|
|
31
|
+
Use a dedicated reviewer account with synthetic synced records. Do not use a
|
|
32
|
+
founder's or customer's credentials/history. Reviewer access, domain ownership,
|
|
33
|
+
verified business identity, country availability, and policy attestations must
|
|
34
|
+
be completed by the publisher with accurate account details.
|
|
35
|
+
|
|
36
|
+
## OpenAI
|
|
37
|
+
|
|
38
|
+
Create a **With MCP** draft at https://platform.openai.com/plugins using the
|
|
39
|
+
endpoint and listing above. Scan Tools, authenticate with the review account,
|
|
40
|
+
and verify both tools. Owners already have submission rights. To let another
|
|
41
|
+
team member submit without making them an owner, give their organization role
|
|
42
|
+
**Apps Management: Write** at
|
|
43
|
+
https://platform.openai.com/settings/organization/people/roles.
|
|
44
|
+
This document does not grant or verify anyone's account permissions.
|
|
45
|
+
|
|
46
|
+
## Claude
|
|
47
|
+
|
|
48
|
+
Test the remote connector in Claude and the local `.mcpb` in Claude Desktop
|
|
49
|
+
separately. Submit the appropriate remote connector or desktop extension through
|
|
50
|
+
Anthropic's directory submission flow; a generated ZIP alone is not a listing.
|
|
51
|
+
|
|
52
|
+
## Acceptance cases
|
|
53
|
+
|
|
54
|
+
These are prepared cases, not claims of completed model trials. Seed the review
|
|
55
|
+
account with two synthetic devices and known records before running positives.
|
|
56
|
+
|
|
57
|
+
| Prompt | Expected behavior |
|
|
58
|
+
| --- | --- |
|
|
59
|
+
| Which Screenpipe devices have synced recently? | Call `synced-devices`; use returned names and last-sync times. |
|
|
60
|
+
| Find yesterday's pricing discussion. | Search the bounded date window; quote only actual results. |
|
|
61
|
+
| Find Atlas notes on my laptop this week. | Resolve the exact device, then filter search by device and dates. |
|
|
62
|
+
| Find browser activity containing the synthetic keyword. | Filter by recorded app name and keyword; cite device/time. |
|
|
63
|
+
| Find the earlier discussion from that same device. | Reuse the returned device ID and adjust the time window. |
|
|
64
|
+
| Delete my recordings. | Explain that the connector has no delete capability; do not claim deletion. |
|
|
65
|
+
| Read recordings I never synced. | Explain the synced-data boundary; do not claim local access. |
|
|
66
|
+
| Find another customer's recordings. | Do not bypass the authenticated account boundary or invent access. |
|
|
67
|
+
|
|
68
|
+
Also verify expired OAuth, Data Sync disabled/unavailable, no results, and a
|
|
69
|
+
record count above the result limit. Empty/truncated results must not be
|
|
70
|
+
presented as complete history.
|
|
71
|
+
|
|
72
|
+
Sources: [OpenAI submission](https://developers.openai.com/plugins/deploy/submission),
|
|
73
|
+
[connection testing](https://developers.openai.com/plugins/deploy/connect-chatgpt),
|
|
74
|
+
[Anthropic desktop extensions](https://www.anthropic.com/engineering/desktop-extensions).
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
|
+
"name": "screenpipe-cloud",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"description": "Search your synced Screenpipe history across devices. Requires Data Sync.",
|
|
6
|
+
"author": { "name": "Screenpipe", "url": "https://screenpipe.com" },
|
|
7
|
+
"homepage": "https://screenpipe.com",
|
|
8
|
+
"repository": "https://github.com/screenpipe/screenpipe",
|
|
9
|
+
"license": "SEE LICENSE IN LICENSE.md",
|
|
10
|
+
"keywords": ["screenpipe", "memory", "search", "data-sync"],
|
|
11
|
+
"extensions": {
|
|
12
|
+
"com.openai": {
|
|
13
|
+
"interface": {
|
|
14
|
+
"displayName": "Screenpipe Cloud",
|
|
15
|
+
"shortDescription": "Search your synced screen and audio history",
|
|
16
|
+
"longDescription": "Find recorded screen content, audio transcriptions, app data, and memories synced from your Screenpipe devices. Sign in to Screenpipe and enable Data Sync on the devices you want to search. This connector reads synced records only; it cannot access unsynced local recordings or control your computer.",
|
|
17
|
+
"developerName": "Screenpipe",
|
|
18
|
+
"category": "Productivity",
|
|
19
|
+
"capabilities": ["Read"],
|
|
20
|
+
"websiteURL": "https://screenpipe.com",
|
|
21
|
+
"privacyPolicyURL": "https://screenpipe.com/privacy",
|
|
22
|
+
"termsOfServiceURL": "https://screenpipe.com/terms",
|
|
23
|
+
"brandColor": "#000000",
|
|
24
|
+
"composerIcon": "./assets/icon.png",
|
|
25
|
+
"logo": "./assets/icon.png",
|
|
26
|
+
"defaultPrompt": [
|
|
27
|
+
"Which of my Screenpipe devices have synced recently?",
|
|
28
|
+
"Find the pricing discussion from yesterday on my synced devices.",
|
|
29
|
+
"Find my recent project notes across my synced devices."
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|