pseudonym-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/LICENSE +21 -0
- package/README.md +354 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +40 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/manager.d.ts +40 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +75 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/core/engine.d.ts +32 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +110 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/mapping-store.d.ts +24 -0
- package/dist/core/mapping-store.d.ts.map +1 -0
- package/dist/core/mapping-store.js +47 -0
- package/dist/core/mapping-store.js.map +1 -0
- package/dist/core/ollama-client.d.ts +21 -0
- package/dist/core/ollama-client.d.ts.map +1 -0
- package/dist/core/ollama-client.js +67 -0
- package/dist/core/ollama-client.js.map +1 -0
- package/dist/languages/en/rules.d.ts +3 -0
- package/dist/languages/en/rules.d.ts.map +1 -0
- package/dist/languages/en/rules.js +69 -0
- package/dist/languages/en/rules.js.map +1 -0
- package/dist/languages/pl/rules.d.ts +3 -0
- package/dist/languages/pl/rules.d.ts.map +1 -0
- package/dist/languages/pl/rules.js +44 -0
- package/dist/languages/pl/rules.js.map +1 -0
- package/dist/languages/types.d.ts +12 -0
- package/dist/languages/types.d.ts.map +1 -0
- package/dist/languages/types.js +2 -0
- package/dist/languages/types.js.map +1 -0
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +93 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/setup/check-ollama.d.ts +15 -0
- package/dist/setup/check-ollama.d.ts.map +1 -0
- package/dist/setup/check-ollama.js +58 -0
- package/dist/setup/check-ollama.js.map +1 -0
- package/mcp-config.json +8 -0
- package/package.json +103 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check whether Ollama is running and whether the required model is available.
|
|
3
|
+
*/
|
|
4
|
+
export async function checkOllama(baseUrl, model, timeoutMs = 3_000) {
|
|
5
|
+
// Step 1: Check reachability
|
|
6
|
+
let tagsRes;
|
|
7
|
+
try {
|
|
8
|
+
const controller = new AbortController();
|
|
9
|
+
const t = setTimeout(() => controller.abort(), timeoutMs);
|
|
10
|
+
tagsRes = await fetch(`${baseUrl}/api/tags`, { signal: controller.signal });
|
|
11
|
+
clearTimeout(t);
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
return {
|
|
15
|
+
running: false,
|
|
16
|
+
modelAvailable: false,
|
|
17
|
+
error: `Ollama is not reachable at ${baseUrl}: ${String(err)}`,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
if (!tagsRes.ok) {
|
|
21
|
+
return {
|
|
22
|
+
running: false,
|
|
23
|
+
modelAvailable: false,
|
|
24
|
+
error: `Ollama returned HTTP ${tagsRes.status} at ${baseUrl}`,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
// Step 2: Check model availability
|
|
28
|
+
try {
|
|
29
|
+
const data = (await tagsRes.json());
|
|
30
|
+
const models = data.models ?? [];
|
|
31
|
+
const modelAvailable = models.some((m) => m.name === model || m.name.startsWith(`${model}:`));
|
|
32
|
+
return { running: true, modelAvailable };
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return { running: true, modelAvailable: false };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Print a user-friendly warning to stderr if Ollama is unavailable or
|
|
40
|
+
* the required model is missing. Never throws — errors are non-fatal.
|
|
41
|
+
*/
|
|
42
|
+
export async function printOllamaStatus(baseUrl, model) {
|
|
43
|
+
const result = await checkOllama(baseUrl, model);
|
|
44
|
+
if (!result.running) {
|
|
45
|
+
process.stderr.write(`\n[pseudonym-mcp] WARNING: Ollama not detected at ${baseUrl}\n` +
|
|
46
|
+
` Install Ollama: https://ollama.com/download\n` +
|
|
47
|
+
` Then start it: ollama serve\n` +
|
|
48
|
+
` The LLM NER phase will be skipped until Ollama is available.\n` +
|
|
49
|
+
` Use --engines regex to suppress this warning.\n\n`);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (!result.modelAvailable) {
|
|
53
|
+
process.stderr.write(`\n[pseudonym-mcp] WARNING: Model "${model}" not found in Ollama.\n` +
|
|
54
|
+
` Pull it with: ollama pull ${model}\n` +
|
|
55
|
+
` The LLM NER phase will fail gracefully until the model is available.\n\n`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=check-ollama.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-ollama.js","sourceRoot":"","sources":["../../src/setup/check-ollama.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAe,EACf,KAAa,EACb,SAAS,GAAG,KAAK;IAEjB,6BAA6B;IAC7B,IAAI,OAAiB,CAAA;IACrB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;QACxC,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAA;QACzD,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,WAAW,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;QAC3E,YAAY,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,cAAc,EAAE,KAAK;YACrB,KAAK,EAAE,8BAA8B,OAAO,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE;SAC/D,CAAA;IACH,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,cAAc,EAAE,KAAK;YACrB,KAAK,EAAE,wBAAwB,OAAO,CAAC,MAAM,OAAO,OAAO,EAAE;SAC9D,CAAA;IACH,CAAC;IAED,mCAAmC;IACnC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAyC,CAAA;QAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAA;QAChC,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAChC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,KAAK,GAAG,CAAC,CAC1D,CAAA;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,CAAA;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAA;IACjD,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAe,EACf,KAAa;IAEb,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAEhD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qDAAqD,OAAO,IAAI;YAC9D,iDAAiD;YACjD,iCAAiC;YACjC,kEAAkE;YAClE,qDAAqD,CACxD,CAAA;QACD,OAAM;IACR,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qCAAqC,KAAK,0BAA0B;YAClE,+BAA+B,KAAK,IAAI;YACxC,4EAA4E,CAC/E,CAAA;IACH,CAAC;AACH,CAAC"}
|
package/mcp-config.json
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "pseudonym-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for privacy-preserving pseudonymization of sensitive data before cloud LLM processing",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"pseudonym-mcp": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/cli.js",
|
|
10
|
+
"types": "./dist/cli.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": "./dist/cli.js",
|
|
14
|
+
"types": "./dist/cli.d.ts"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"engines": {
|
|
18
|
+
"node": ">=18.0.0"
|
|
19
|
+
},
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsc",
|
|
22
|
+
"test": "vitest",
|
|
23
|
+
"test:ui": "vitest --ui",
|
|
24
|
+
"test:coverage": "vitest --coverage",
|
|
25
|
+
"start": "node dist/cli.js",
|
|
26
|
+
"prepare": "npm run build"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"mcp",
|
|
30
|
+
"model-context-protocol",
|
|
31
|
+
"privacy",
|
|
32
|
+
"pseudonymization",
|
|
33
|
+
"anonymization",
|
|
34
|
+
"pii",
|
|
35
|
+
"pii-masking",
|
|
36
|
+
"pii-redaction",
|
|
37
|
+
"nlp",
|
|
38
|
+
"ner",
|
|
39
|
+
"named-entity-recognition",
|
|
40
|
+
"gdpr",
|
|
41
|
+
"gdpr-compliance",
|
|
42
|
+
"rodo",
|
|
43
|
+
"ai-privacy",
|
|
44
|
+
"llm-privacy",
|
|
45
|
+
"data-minimisation",
|
|
46
|
+
"privacy-by-design",
|
|
47
|
+
"pesel",
|
|
48
|
+
"iban",
|
|
49
|
+
"ollama",
|
|
50
|
+
"claude",
|
|
51
|
+
"zero-trust"
|
|
52
|
+
],
|
|
53
|
+
"author": "Adrian Wolczuk",
|
|
54
|
+
"license": "MIT",
|
|
55
|
+
"repository": {
|
|
56
|
+
"type": "git",
|
|
57
|
+
"url": "git+https://github.com/woladi/pseudonym-mcp.git"
|
|
58
|
+
},
|
|
59
|
+
"homepage": "https://github.com/woladi/pseudonym-mcp#readme",
|
|
60
|
+
"bugs": {
|
|
61
|
+
"url": "https://github.com/woladi/pseudonym-mcp/issues"
|
|
62
|
+
},
|
|
63
|
+
"files": [
|
|
64
|
+
"dist/",
|
|
65
|
+
"mcp-config.json",
|
|
66
|
+
"README.md",
|
|
67
|
+
"LICENSE"
|
|
68
|
+
],
|
|
69
|
+
"dependencies": {
|
|
70
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
71
|
+
"commander": "^14.0.0",
|
|
72
|
+
"zod": "^3.25.0"
|
|
73
|
+
},
|
|
74
|
+
"devDependencies": {
|
|
75
|
+
"@release-it/conventional-changelog": "^10.0.0",
|
|
76
|
+
"@types/node": "^22.0.0",
|
|
77
|
+
"@vitest/coverage-v8": "^3.0.0",
|
|
78
|
+
"@vitest/ui": "^3.0.0",
|
|
79
|
+
"release-it": "^19.0.0",
|
|
80
|
+
"typescript": "^5.8.0",
|
|
81
|
+
"vitest": "^3.0.0"
|
|
82
|
+
},
|
|
83
|
+
"release-it": {
|
|
84
|
+
"$schema": "https://unpkg.com/release-it/schema/release-it.json",
|
|
85
|
+
"git": {
|
|
86
|
+
"commitMessage": "chore: release v${version}",
|
|
87
|
+
"tagName": "v${version}"
|
|
88
|
+
},
|
|
89
|
+
"npm": {
|
|
90
|
+
"publish": true
|
|
91
|
+
},
|
|
92
|
+
"github": {
|
|
93
|
+
"release": true,
|
|
94
|
+
"releaseName": "v${version}"
|
|
95
|
+
},
|
|
96
|
+
"plugins": {
|
|
97
|
+
"@release-it/conventional-changelog": {
|
|
98
|
+
"preset": "conventionalcommits",
|
|
99
|
+
"infile": "CHANGELOG.md"
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|