@tuteliq/mcp 3.3.3 → 3.3.5
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 +95 -33
- package/dist/src/tools/admin.js +1 -1
- package/dist/src/tools/analysis.d.ts.map +1 -1
- package/dist/src/tools/analysis.js +3 -1
- package/dist/src/tools/detection.d.ts.map +1 -1
- package/dist/src/tools/detection.js +9 -3
- package/dist/src/tools/fraud.d.ts.map +1 -1
- package/dist/src/tools/fraud.js +3 -1
- package/dist-ui/action-plan.html +25 -25
- package/dist-ui/detection-result.html +24 -24
- package/dist-ui/emotions-result.html +26 -26
- package/dist-ui/media-result.html +26 -26
- package/dist-ui/multi-result.html +55 -55
- package/dist-ui/report-result.html +55 -55
- package/package.json +22 -4
package/README.md
CHANGED
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
|
|
27
27
|
Tuteliq MCP Server brings AI-powered child safety tools directly into Claude, Cursor, and other MCP-compatible AI assistants. Ask Claude to check messages for bullying, detect grooming patterns, or generate safety action plans.
|
|
28
28
|
|
|
29
|
-
## Available Tools (
|
|
29
|
+
## Available Tools (41 MCP + 2 API-only)
|
|
30
30
|
|
|
31
31
|
### Safety Detection
|
|
32
32
|
|
|
@@ -36,16 +36,31 @@ Tuteliq MCP Server brings AI-powered child safety tools directly into Claude, Cu
|
|
|
36
36
|
| `detect_grooming` | Detect grooming patterns and predatory behavior in conversations |
|
|
37
37
|
| `detect_unsafe` | Identify unsafe content (self-harm, violence, explicit material) |
|
|
38
38
|
| `analyze` | Quick comprehensive safety check (bullying + unsafe) |
|
|
39
|
+
| `analyse_multi` | Run multiple detection endpoints on a single piece of text in one call |
|
|
39
40
|
| `analyze_emotions` | Analyze emotional content and mental state indicators |
|
|
40
41
|
| `get_action_plan` | Generate age-appropriate guidance for safety situations |
|
|
41
42
|
| `generate_report` | Create incident reports from conversations |
|
|
42
43
|
|
|
43
|
-
###
|
|
44
|
+
### Fraud & Harm Detection
|
|
45
|
+
|
|
46
|
+
| Tool | Description |
|
|
47
|
+
|------|-------------|
|
|
48
|
+
| `detect_social_engineering` | Detect social engineering tactics (pretexting, urgency fabrication, authority impersonation) |
|
|
49
|
+
| `detect_app_fraud` | Detect app-based fraud (fake investment platforms, phishing apps, subscription traps) |
|
|
50
|
+
| `detect_romance_scam` | Detect romance scam patterns (love-bombing, financial requests, identity deception) |
|
|
51
|
+
| `detect_mule_recruitment` | Detect money mule recruitment tactics (easy-money offers, bank account sharing) |
|
|
52
|
+
| `detect_gambling_harm` | Detect gambling-related harm indicators (chasing losses, concealment, distress) |
|
|
53
|
+
| `detect_coercive_control` | Detect coercive control patterns (isolation, financial control, monitoring, threats) |
|
|
54
|
+
| `detect_vulnerability_exploitation` | Detect exploitation of vulnerable individuals (elderly, disabled, financially distressed) |
|
|
55
|
+
| `detect_radicalisation` | Detect radicalisation indicators (extremist rhetoric, us-vs-them framing, ideological grooming) |
|
|
56
|
+
|
|
57
|
+
### Voice, Image & Video Analysis
|
|
44
58
|
|
|
45
59
|
| Tool | Description |
|
|
46
60
|
|------|-------------|
|
|
47
61
|
| `analyze_voice` | Transcribe audio and run safety analysis on the transcript |
|
|
48
62
|
| `analyze_image` | Analyze images for visual safety + OCR text extraction |
|
|
63
|
+
| `analyze_video` | Analyze video files for safety concerns via key frame extraction (supports mp4, mov, avi, webm, mkv) |
|
|
49
64
|
|
|
50
65
|
### Webhook Management
|
|
51
66
|
|
|
@@ -94,7 +109,9 @@ Tuteliq MCP Server brings AI-powered child safety tools directly into Claude, Cu
|
|
|
94
109
|
| `get_breach` | Get details of a specific data breach |
|
|
95
110
|
| `update_breach_status` | Update breach status and notification progress |
|
|
96
111
|
|
|
97
|
-
### Verification
|
|
112
|
+
### Verification (API & SDK only)
|
|
113
|
+
|
|
114
|
+
These tools are available via the [REST API](https://docs.tuteliq.ai) and the [@tuteliq/sdk](https://www.npmjs.com/package/@tuteliq/sdk) Node SDK — not yet exposed as MCP tools.
|
|
98
115
|
|
|
99
116
|
| Tool | Description |
|
|
100
117
|
|------|-------------|
|
|
@@ -105,27 +122,38 @@ Tuteliq MCP Server brings AI-powered child safety tools directly into Claude, Cu
|
|
|
105
122
|
|
|
106
123
|
## Installation
|
|
107
124
|
|
|
108
|
-
### Claude Desktop
|
|
125
|
+
### Claude Desktop (Recommended)
|
|
126
|
+
|
|
127
|
+
1. Open Claude Desktop and go to **Settings > Connectors**
|
|
128
|
+
2. Click **Add custom connector**
|
|
129
|
+
3. Set the name to **Tuteliq** and the URL to:
|
|
130
|
+
```
|
|
131
|
+
https://api.tuteliq.ai/mcp
|
|
132
|
+
```
|
|
133
|
+
4. When prompted, enter your Tuteliq API key
|
|
134
|
+
|
|
135
|
+
That's it — Tuteliq tools will be available in your next conversation.
|
|
136
|
+
|
|
137
|
+
### Cursor
|
|
109
138
|
|
|
110
|
-
Add to your
|
|
139
|
+
Add to your Cursor MCP settings:
|
|
111
140
|
|
|
112
141
|
```json
|
|
113
142
|
{
|
|
114
143
|
"mcpServers": {
|
|
115
144
|
"tuteliq": {
|
|
116
|
-
"
|
|
117
|
-
"
|
|
118
|
-
|
|
119
|
-
"TUTELIQ_API_KEY": "your-api-key"
|
|
145
|
+
"url": "https://api.tuteliq.ai/mcp",
|
|
146
|
+
"headers": {
|
|
147
|
+
"Authorization": "Bearer your-api-key"
|
|
120
148
|
}
|
|
121
149
|
}
|
|
122
150
|
}
|
|
123
151
|
}
|
|
124
152
|
```
|
|
125
153
|
|
|
126
|
-
###
|
|
154
|
+
### Other MCP clients (npx)
|
|
127
155
|
|
|
128
|
-
|
|
156
|
+
For clients that support stdio transport:
|
|
129
157
|
|
|
130
158
|
```json
|
|
131
159
|
{
|
|
@@ -141,17 +169,6 @@ Add to your Cursor MCP settings:
|
|
|
141
169
|
}
|
|
142
170
|
```
|
|
143
171
|
|
|
144
|
-
### Global Install
|
|
145
|
-
|
|
146
|
-
```bash
|
|
147
|
-
npm install -g @tuteliq/mcp
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
Then run:
|
|
151
|
-
```bash
|
|
152
|
-
TUTELIQ_API_KEY=your-api-key tuteliq-mcp
|
|
153
|
-
```
|
|
154
|
-
|
|
155
172
|
---
|
|
156
173
|
|
|
157
174
|
## Usage Examples
|
|
@@ -206,21 +223,18 @@ The message contains direct exclusionary language...
|
|
|
206
223
|
### Usage
|
|
207
224
|
> "Show my monthly usage"
|
|
208
225
|
|
|
209
|
-
###
|
|
210
|
-
> "
|
|
211
|
-
> "
|
|
212
|
-
|
|
213
|
-
### Identity Verification
|
|
214
|
-
> "Verify this user's identity by matching their selfie against their ID document"
|
|
226
|
+
### Fraud Detection
|
|
227
|
+
> "Check this message for social engineering: 'Your account will be suspended unless you verify now'"
|
|
228
|
+
> "Is this a romance scam? 'I know we just met online but I need help with a medical bill'"
|
|
215
229
|
|
|
216
230
|
---
|
|
217
231
|
|
|
218
|
-
## Get
|
|
232
|
+
## Get Started (Free)
|
|
219
233
|
|
|
220
|
-
1.
|
|
221
|
-
2.
|
|
222
|
-
3.
|
|
223
|
-
4.
|
|
234
|
+
1. [Create a free Tuteliq account](https://tuteliq.ai)
|
|
235
|
+
2. Go to your [Dashboard](https://tuteliq.ai/dashboard) and generate an **API Key**
|
|
236
|
+
3. For Claude Desktop and other MCP plugins, generate a **Secure Token** under **Settings > Plugins**
|
|
237
|
+
4. Use the API key for direct API/SDK access, or the Secure Token when connecting via MCP
|
|
224
238
|
|
|
225
239
|
---
|
|
226
240
|
|
|
@@ -231,6 +245,42 @@ The message contains direct exclusionary language...
|
|
|
231
245
|
|
|
232
246
|
---
|
|
233
247
|
|
|
248
|
+
## Supported Languages (27)
|
|
249
|
+
|
|
250
|
+
Language is auto-detected when not specified. Beta languages have good accuracy but may have edge cases compared to English.
|
|
251
|
+
|
|
252
|
+
| Language | Code | Status |
|
|
253
|
+
|----------|------|--------|
|
|
254
|
+
| English | `en` | Stable |
|
|
255
|
+
| Spanish | `es` | Beta |
|
|
256
|
+
| Portuguese | `pt` | Beta |
|
|
257
|
+
| French | `fr` | Beta |
|
|
258
|
+
| German | `de` | Beta |
|
|
259
|
+
| Italian | `it` | Beta |
|
|
260
|
+
| Dutch | `nl` | Beta |
|
|
261
|
+
| Polish | `pl` | Beta |
|
|
262
|
+
| Romanian | `ro` | Beta |
|
|
263
|
+
| Turkish | `tr` | Beta |
|
|
264
|
+
| Greek | `el` | Beta |
|
|
265
|
+
| Czech | `cs` | Beta |
|
|
266
|
+
| Hungarian | `hu` | Beta |
|
|
267
|
+
| Bulgarian | `bg` | Beta |
|
|
268
|
+
| Croatian | `hr` | Beta |
|
|
269
|
+
| Slovak | `sk` | Beta |
|
|
270
|
+
| Slovenian | `sl` | Beta |
|
|
271
|
+
| Lithuanian | `lt` | Beta |
|
|
272
|
+
| Latvian | `lv` | Beta |
|
|
273
|
+
| Estonian | `et` | Beta |
|
|
274
|
+
| Maltese | `mt` | Beta |
|
|
275
|
+
| Irish | `ga` | Beta |
|
|
276
|
+
| Swedish | `sv` | Beta |
|
|
277
|
+
| Norwegian | `no` | Beta |
|
|
278
|
+
| Danish | `da` | Beta |
|
|
279
|
+
| Finnish | `fi` | Beta |
|
|
280
|
+
| Ukrainian | `uk` | Beta |
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
234
284
|
## Best Practices
|
|
235
285
|
|
|
236
286
|
### Message Batching
|
|
@@ -245,6 +295,18 @@ Enable `PII_REDACTION_ENABLED=true` on your Tuteliq API to automatically strip e
|
|
|
245
295
|
|
|
246
296
|
---
|
|
247
297
|
|
|
298
|
+
## Supported Languages
|
|
299
|
+
|
|
300
|
+
Tuteliq supports **27 languages** with automatic detection — no configuration required.
|
|
301
|
+
|
|
302
|
+
**English** (stable) and **26 beta languages**: Spanish, Portuguese, Ukrainian, Swedish, Norwegian, Danish, Finnish, German, French, Dutch, Polish, Italian, Turkish, Romanian, Greek, Czech, Hungarian, Bulgarian, Croatian, Slovak, Lithuanian, Latvian, Estonian, Slovenian, Maltese, and Irish.
|
|
303
|
+
|
|
304
|
+
All 24 EU official languages + Ukrainian, Norwegian, and Turkish. Each language includes culture-specific safety guidelines covering local slang, grooming patterns, self-harm coded vocabulary, and filter evasion techniques.
|
|
305
|
+
|
|
306
|
+
See the [Language Support docs](https://docs.tuteliq.ai/languages) for details.
|
|
307
|
+
|
|
308
|
+
---
|
|
309
|
+
|
|
248
310
|
## Support
|
|
249
311
|
|
|
250
312
|
- **API Docs**: [docs.tuteliq.ai](https://docs.tuteliq.ai)
|
package/dist/src/tools/admin.js
CHANGED
|
@@ -129,7 +129,7 @@ ${result.recommendations ? `### Recommendation\n${result.recommendations.reason}
|
|
|
129
129
|
return { content: [{ type: 'text', text: `## \u26A0\uFE0F Consent Withdrawn\n\n**Type:** ${result.consent.consent_type}\n**Status:** ${result.consent.status}` }] };
|
|
130
130
|
});
|
|
131
131
|
server.tool('rectify_data', 'Rectify (correct) user data (GDPR Right to Rectification).', {
|
|
132
|
-
collection: z.string().describe('
|
|
132
|
+
collection: z.string().describe('Collection name'),
|
|
133
133
|
document_id: z.string().describe('Document ID to rectify'),
|
|
134
134
|
fields: z.record(z.string(), z.unknown()).describe('Fields to update'),
|
|
135
135
|
}, async ({ collection, document_id, fields }) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../../../src/tools/analysis.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,OAAO,EAAgB,MAAM,cAAc,CAAC;AAkC1D,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../../../src/tools/analysis.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,OAAO,EAAgB,MAAM,cAAc,CAAC;AAkC1D,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAoO9E"}
|
|
@@ -192,6 +192,7 @@ ${result.recommended_next_steps.map((step, i) => `${i + 1}. ${step}`).join('\n')
|
|
|
192
192
|
endpoints: z.array(z.string()).describe('Detection endpoints to run'),
|
|
193
193
|
context: z.record(z.string(), z.unknown()).optional().describe('Optional analysis context'),
|
|
194
194
|
include_evidence: z.boolean().optional().describe('Include supporting evidence'),
|
|
195
|
+
support_threshold: z.enum(['low', 'medium', 'high', 'critical']).optional().describe('Minimum severity to show crisis support resources (default: high). Critical always shows.'),
|
|
195
196
|
external_id: z.string().optional().describe('External tracking ID'),
|
|
196
197
|
customer_id: z.string().optional().describe('Customer identifier'),
|
|
197
198
|
},
|
|
@@ -201,13 +202,14 @@ ${result.recommended_next_steps.map((step, i) => `${i + 1}. ${step}`).join('\n')
|
|
|
201
202
|
'openai/toolInvocation/invoking': 'Running multi-endpoint analysis...',
|
|
202
203
|
'openai/toolInvocation/invoked': 'Multi-endpoint analysis complete.',
|
|
203
204
|
},
|
|
204
|
-
}, async ({ content, endpoints, context, include_evidence, external_id, customer_id }) => {
|
|
205
|
+
}, async ({ content, endpoints, context, include_evidence, support_threshold, external_id, customer_id }) => {
|
|
205
206
|
try {
|
|
206
207
|
const result = await client.analyseMulti({
|
|
207
208
|
content,
|
|
208
209
|
detections: endpoints,
|
|
209
210
|
context: context,
|
|
210
211
|
includeEvidence: include_evidence,
|
|
212
|
+
supportThreshold: support_threshold,
|
|
211
213
|
external_id,
|
|
212
214
|
customer_id,
|
|
213
215
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detection.d.ts","sourceRoot":"","sources":["../../../src/tools/detection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AA6C5C,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"detection.d.ts","sourceRoot":"","sources":["../../../src/tools/detection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AA6C5C,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CA2N/E"}
|
|
@@ -54,13 +54,15 @@ export function registerDetectionTools(server, client) {
|
|
|
54
54
|
inputSchema: {
|
|
55
55
|
content: z.string().describe('The text content to analyze for bullying'),
|
|
56
56
|
context: contextSchema,
|
|
57
|
+
support_threshold: z.enum(['low', 'medium', 'high', 'critical']).optional().describe('Minimum severity to show crisis support resources (default: high). Critical always shows.'),
|
|
57
58
|
},
|
|
58
59
|
_meta: uiMeta('Shows bullying detection results with risk indicators', 'Analyzing content for bullying...', 'Bullying analysis complete.'),
|
|
59
|
-
}, async ({ content, context }) => {
|
|
60
|
+
}, async ({ content, context, support_threshold }) => {
|
|
60
61
|
try {
|
|
61
62
|
const result = await client.detectBullying({
|
|
62
63
|
content,
|
|
63
64
|
context: context,
|
|
65
|
+
supportThreshold: support_threshold,
|
|
64
66
|
});
|
|
65
67
|
const emoji = severityEmoji[result.severity] || '\u26AA';
|
|
66
68
|
let text = `## ${result.is_bullying ? '\u26A0\uFE0F Bullying Detected' : '\u2705 No Bullying Detected'}
|
|
@@ -101,13 +103,15 @@ ${result.rationale}
|
|
|
101
103
|
content: z.string(),
|
|
102
104
|
})).describe('Array of messages in the conversation'),
|
|
103
105
|
childAge: z.number().optional().describe('Age of the child in the conversation'),
|
|
106
|
+
support_threshold: z.enum(['low', 'medium', 'high', 'critical']).optional().describe('Minimum severity to show crisis support resources (default: high). Critical always shows.'),
|
|
104
107
|
},
|
|
105
108
|
_meta: uiMeta('Shows grooming detection results with risk indicators', 'Analyzing conversation for grooming patterns...', 'Grooming analysis complete.'),
|
|
106
|
-
}, async ({ messages, childAge }) => {
|
|
109
|
+
}, async ({ messages, childAge, support_threshold }) => {
|
|
107
110
|
try {
|
|
108
111
|
const result = await client.detectGrooming({
|
|
109
112
|
messages,
|
|
110
113
|
childAge,
|
|
114
|
+
supportThreshold: support_threshold,
|
|
111
115
|
});
|
|
112
116
|
const emoji = riskEmoji[result.grooming_risk] || '\u26AA';
|
|
113
117
|
let text = `## ${result.grooming_risk === 'none' ? '\u2705 No Grooming Detected' : '\u26A0\uFE0F Grooming Risk Detected'}
|
|
@@ -145,13 +149,15 @@ ${result.rationale}
|
|
|
145
149
|
inputSchema: {
|
|
146
150
|
content: z.string().describe('The text content to analyze for unsafe content'),
|
|
147
151
|
context: contextSchema,
|
|
152
|
+
support_threshold: z.enum(['low', 'medium', 'high', 'critical']).optional().describe('Minimum severity to show crisis support resources (default: high). Critical always shows.'),
|
|
148
153
|
},
|
|
149
154
|
_meta: uiMeta('Shows unsafe content detection results', 'Analyzing content for safety concerns...', 'Safety analysis complete.'),
|
|
150
|
-
}, async ({ content, context }) => {
|
|
155
|
+
}, async ({ content, context, support_threshold }) => {
|
|
151
156
|
try {
|
|
152
157
|
const result = await client.detectUnsafe({
|
|
153
158
|
content,
|
|
154
159
|
context: context,
|
|
160
|
+
supportThreshold: support_threshold,
|
|
155
161
|
});
|
|
156
162
|
const emoji = severityEmoji[result.severity] || '\u26AA';
|
|
157
163
|
let text = `## ${result.unsafe ? '\u26A0\uFE0F Unsafe Content Detected' : '\u2705 Content is Safe'}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fraud.d.ts","sourceRoot":"","sources":["../../../src/tools/fraud.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,OAAO,EAAgB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"fraud.d.ts","sourceRoot":"","sources":["../../../src/tools/fraud.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,OAAO,EAAgB,MAAM,cAAc,CAAC;AA0F1D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAmD3E"}
|
package/dist/src/tools/fraud.js
CHANGED
|
@@ -72,6 +72,7 @@ const fraudInputSchema = {
|
|
|
72
72
|
content: z.string().describe('Text content to analyze'),
|
|
73
73
|
context: z.record(z.string(), z.unknown()).optional().describe('Optional analysis context'),
|
|
74
74
|
include_evidence: z.boolean().optional().describe('Include supporting evidence excerpts'),
|
|
75
|
+
support_threshold: z.enum(['low', 'medium', 'high', 'critical']).optional().describe('Minimum severity to show crisis support resources (default: high). Critical always shows.'),
|
|
75
76
|
external_id: z.string().optional().describe('External tracking ID'),
|
|
76
77
|
customer_id: z.string().optional().describe('Customer identifier'),
|
|
77
78
|
};
|
|
@@ -88,13 +89,14 @@ export function registerFraudTools(server, client) {
|
|
|
88
89
|
'openai/toolInvocation/invoking': tool.invoking,
|
|
89
90
|
'openai/toolInvocation/invoked': tool.invoked,
|
|
90
91
|
},
|
|
91
|
-
}, async ({ content, context, include_evidence, external_id, customer_id }) => {
|
|
92
|
+
}, async ({ content, context, include_evidence, support_threshold, external_id, customer_id }) => {
|
|
92
93
|
try {
|
|
93
94
|
const fn = client[tool.method].bind(client);
|
|
94
95
|
const result = await fn({
|
|
95
96
|
content,
|
|
96
97
|
context: context,
|
|
97
98
|
includeEvidence: include_evidence,
|
|
99
|
+
supportThreshold: support_threshold,
|
|
98
100
|
external_id,
|
|
99
101
|
customer_id,
|
|
100
102
|
});
|