@tuteliq/mcp 3.3.4 → 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 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 (35)
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
- ### Voice & Image Analysis
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 Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json` on Mac):
139
+ Add to your Cursor MCP settings:
111
140
 
112
141
  ```json
113
142
  {
114
143
  "mcpServers": {
115
144
  "tuteliq": {
116
- "command": "npx",
117
- "args": ["-y", "@tuteliq/mcp"],
118
- "env": {
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
- ### Cursor
154
+ ### Other MCP clients (npx)
127
155
 
128
- Add to your Cursor MCP settings:
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
- ### Age Verification
210
- > "Verify the age of this user using their uploaded ID document"
211
- > "Estimate this user's age from their selfie using biometric analysis"
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 an API Key
232
+ ## Get Started (Free)
219
233
 
220
- 1. Go to [tuteliq.ai](https://tuteliq.ai)
221
- 2. Create an account
222
- 3. Generate an API key
223
- 4. Add it to your MCP config
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)
@@ -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('Firestore collection name'),
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,CAkO9E"}
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,CAqN/E"}
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;AAyF1D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAkD3E"}
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"}
@@ -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
  });