@humantext/mcp-server 1.0.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 +159 -0
- package/dist/api-client.d.ts +59 -0
- package/dist/api-client.js +63 -0
- package/dist/api-client.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +272 -0
- package/dist/index.js.map +1 -0
- package/package.json +51 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 humantext.pro
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# humantext.pro MCP Server
|
|
2
|
+
|
|
3
|
+
AI text detection and humanization tools for Claude Code, Cursor, Windsurf, and any MCP-compatible client.
|
|
4
|
+
|
|
5
|
+
Check if text sounds AI-generated and transform it to read naturally — without leaving your editor.
|
|
6
|
+
|
|
7
|
+
## Quick Start
|
|
8
|
+
|
|
9
|
+
### 1. Get your API key
|
|
10
|
+
|
|
11
|
+
Sign up at [humantext.pro](https://humantext.pro) and generate an API key on your [API page](https://humantext.pro/api).
|
|
12
|
+
|
|
13
|
+
### 2. Add to your MCP client
|
|
14
|
+
|
|
15
|
+
**Claude Code / VS Code:**
|
|
16
|
+
|
|
17
|
+
Add to `.claude/mcp.json` in your project (or global settings):
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"mcpServers": {
|
|
22
|
+
"humantext": {
|
|
23
|
+
"command": "npx",
|
|
24
|
+
"args": ["-y", "@humantext/mcp-server"],
|
|
25
|
+
"env": {
|
|
26
|
+
"HUMANTEXT_API_KEY": "your_api_key_here"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**Cursor:**
|
|
34
|
+
|
|
35
|
+
Add to `.cursor/mcp.json` in your project:
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"mcpServers": {
|
|
40
|
+
"humantext": {
|
|
41
|
+
"command": "npx",
|
|
42
|
+
"args": ["-y", "@humantext/mcp-server"],
|
|
43
|
+
"env": {
|
|
44
|
+
"HUMANTEXT_API_KEY": "your_api_key_here"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Claude Desktop:**
|
|
52
|
+
|
|
53
|
+
Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"mcpServers": {
|
|
58
|
+
"humantext": {
|
|
59
|
+
"command": "npx",
|
|
60
|
+
"args": ["-y", "@humantext/mcp-server"],
|
|
61
|
+
"env": {
|
|
62
|
+
"HUMANTEXT_API_KEY": "your_api_key_here"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 3. Use it
|
|
70
|
+
|
|
71
|
+
Ask your AI assistant:
|
|
72
|
+
|
|
73
|
+
- *"Check if this text sounds AI-generated"*
|
|
74
|
+
- *"Humanize this paragraph to sound more natural"*
|
|
75
|
+
- *"Humanize this text and verify the result passes AI detection"*
|
|
76
|
+
- *"What's my humantext.pro credit balance?"*
|
|
77
|
+
|
|
78
|
+
## Tools
|
|
79
|
+
|
|
80
|
+
### `detect_ai`
|
|
81
|
+
|
|
82
|
+
Analyze text for AI-generated content. Returns a score (0-100%) and verdict.
|
|
83
|
+
|
|
84
|
+
| Parameter | Type | Required | Description |
|
|
85
|
+
|-----------|--------|----------|-------------|
|
|
86
|
+
| `text` | string | Yes | Text to analyze (min 50 characters) |
|
|
87
|
+
|
|
88
|
+
**Example output:**
|
|
89
|
+
```
|
|
90
|
+
AI Detection Result
|
|
91
|
+
━━━━━━━━━━━━━━━━━━━
|
|
92
|
+
Score: 87% AI
|
|
93
|
+
Verdict: AI Generated
|
|
94
|
+
Words analyzed: 156
|
|
95
|
+
Credits remaining: 4,844
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### `humanize_text`
|
|
99
|
+
|
|
100
|
+
Transform AI-generated text to sound natural and human-written.
|
|
101
|
+
|
|
102
|
+
| Parameter | Type | Required | Description |
|
|
103
|
+
|-----------|--------|----------|-------------|
|
|
104
|
+
| `text` | string | Yes | Text to humanize (min 50 characters) |
|
|
105
|
+
| `tone` | enum | No | `casual`, `standard`, `academic`, `professional`, `marketing` |
|
|
106
|
+
| `style` | enum | No | `general`, `essay`, `article`, `marketing`, `creative`, `formal`, `report`, `business`, `legal` |
|
|
107
|
+
| `level` | enum | No | `light`, `balanced`, `aggressive` (default: aggressive) |
|
|
108
|
+
|
|
109
|
+
### `humanize_and_detect`
|
|
110
|
+
|
|
111
|
+
Two-step process: humanize text, then verify the result with AI detection. Proves the output passes detection.
|
|
112
|
+
|
|
113
|
+
Same parameters as `humanize_text`.
|
|
114
|
+
|
|
115
|
+
**Example output:**
|
|
116
|
+
```
|
|
117
|
+
Humanized & Verified
|
|
118
|
+
━━━━━━━━━━━━━━━━━━━━
|
|
119
|
+
|
|
120
|
+
[humanized text here]
|
|
121
|
+
|
|
122
|
+
━━━━━━━━━━━━━━━━━━━━
|
|
123
|
+
Verification: 12% AI → Mostly Human
|
|
124
|
+
Words: 156 | Credits remaining: 4,532
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### `check_balance`
|
|
128
|
+
|
|
129
|
+
Check your account balance and plan details. No parameters required.
|
|
130
|
+
|
|
131
|
+
## Pricing
|
|
132
|
+
|
|
133
|
+
The MCP server uses your [humantext.pro](https://humantext.pro/pricing) subscription credits:
|
|
134
|
+
|
|
135
|
+
| Plan | Price | Monthly Credits |
|
|
136
|
+
|--------|-----------|-----------------|
|
|
137
|
+
| Basic | $7.99/mo | 5,000 words |
|
|
138
|
+
| Pro | $19.99/mo | 15,000 words |
|
|
139
|
+
| Ultra | $49.99/mo | 30,000 words |
|
|
140
|
+
|
|
141
|
+
Both detection and humanization consume credits based on input word count.
|
|
142
|
+
|
|
143
|
+
## Environment Variables
|
|
144
|
+
|
|
145
|
+
| Variable | Required | Description |
|
|
146
|
+
|---------------------|----------|-------------|
|
|
147
|
+
| `HUMANTEXT_API_KEY` | Yes | API key from humantext.pro/api |
|
|
148
|
+
| `HUMANTEXT_BASE_URL`| No | Custom API URL (default: https://humantext.pro/api/v1) |
|
|
149
|
+
|
|
150
|
+
## Links
|
|
151
|
+
|
|
152
|
+
- [humantext.pro](https://humantext.pro) — AI Detector & Text Humanizer
|
|
153
|
+
- [API Documentation](https://humantext.pro/api/docs) — Interactive Swagger UI
|
|
154
|
+
- [Get API Key](https://humantext.pro/api) — Sign up and generate your key
|
|
155
|
+
- [Pricing](https://humantext.pro/pricing) — Plans and credits
|
|
156
|
+
|
|
157
|
+
## License
|
|
158
|
+
|
|
159
|
+
MIT
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client for humantext.pro API v1
|
|
3
|
+
*/
|
|
4
|
+
export interface DetectResult {
|
|
5
|
+
success: boolean;
|
|
6
|
+
score: number;
|
|
7
|
+
word_count: number;
|
|
8
|
+
credits_remaining: number;
|
|
9
|
+
}
|
|
10
|
+
export interface HumanizeResult {
|
|
11
|
+
success: boolean;
|
|
12
|
+
output: string;
|
|
13
|
+
word_count: number;
|
|
14
|
+
credits_remaining: number;
|
|
15
|
+
}
|
|
16
|
+
export interface AccountResult {
|
|
17
|
+
success: boolean;
|
|
18
|
+
email: string;
|
|
19
|
+
name: string | null;
|
|
20
|
+
plan: string;
|
|
21
|
+
subscription_status: string | null;
|
|
22
|
+
credits: {
|
|
23
|
+
subscription: number;
|
|
24
|
+
package: number;
|
|
25
|
+
total: number;
|
|
26
|
+
};
|
|
27
|
+
limits: {
|
|
28
|
+
words_per_request: number;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export interface ApiError {
|
|
32
|
+
error: string;
|
|
33
|
+
code?: string;
|
|
34
|
+
balance?: number;
|
|
35
|
+
required?: number;
|
|
36
|
+
}
|
|
37
|
+
export type Tone = "casual" | "standard" | "academic" | "professional" | "marketing";
|
|
38
|
+
export type Style = "general" | "essay" | "article" | "marketing" | "creative" | "formal" | "report" | "business" | "legal";
|
|
39
|
+
export type Level = "light" | "balanced" | "aggressive";
|
|
40
|
+
export declare class HumantextApiClient {
|
|
41
|
+
private apiKey;
|
|
42
|
+
private baseUrl;
|
|
43
|
+
constructor(apiKey: string, baseUrl?: string);
|
|
44
|
+
private request;
|
|
45
|
+
detect(content: string): Promise<DetectResult>;
|
|
46
|
+
humanize(content: string, options?: {
|
|
47
|
+
tone?: Tone;
|
|
48
|
+
style?: Style;
|
|
49
|
+
level?: Level;
|
|
50
|
+
}): Promise<HumanizeResult>;
|
|
51
|
+
account(): Promise<AccountResult>;
|
|
52
|
+
}
|
|
53
|
+
export declare class HumantextApiError extends Error {
|
|
54
|
+
status: number;
|
|
55
|
+
code?: string;
|
|
56
|
+
balance?: number;
|
|
57
|
+
required?: number;
|
|
58
|
+
constructor(message: string, status: number, code?: string, balance?: number, required?: number);
|
|
59
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client for humantext.pro API v1
|
|
3
|
+
*/
|
|
4
|
+
const DEFAULT_BASE_URL = "https://humantext.pro/api/v1";
|
|
5
|
+
export class HumantextApiClient {
|
|
6
|
+
apiKey;
|
|
7
|
+
baseUrl;
|
|
8
|
+
constructor(apiKey, baseUrl) {
|
|
9
|
+
this.apiKey = apiKey;
|
|
10
|
+
this.baseUrl = baseUrl || DEFAULT_BASE_URL;
|
|
11
|
+
}
|
|
12
|
+
async request(endpoint, options = {}) {
|
|
13
|
+
const url = `${this.baseUrl}${endpoint}`;
|
|
14
|
+
const response = await fetch(url, {
|
|
15
|
+
...options,
|
|
16
|
+
headers: {
|
|
17
|
+
"Content-Type": "application/json",
|
|
18
|
+
"x-api-key": this.apiKey,
|
|
19
|
+
"x-source": "mcp-server",
|
|
20
|
+
...(options.headers || {}),
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
const data = await response.json();
|
|
24
|
+
if (!response.ok) {
|
|
25
|
+
const error = data;
|
|
26
|
+
throw new HumantextApiError(error.error || `API error ${response.status}`, response.status, error.code, error.balance, error.required);
|
|
27
|
+
}
|
|
28
|
+
return data;
|
|
29
|
+
}
|
|
30
|
+
async detect(content) {
|
|
31
|
+
return this.request("/detect", {
|
|
32
|
+
method: "POST",
|
|
33
|
+
body: JSON.stringify({ content }),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
async humanize(content, options) {
|
|
37
|
+
return this.request("/humanize", {
|
|
38
|
+
method: "POST",
|
|
39
|
+
body: JSON.stringify({
|
|
40
|
+
content,
|
|
41
|
+
...options,
|
|
42
|
+
}),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
async account() {
|
|
46
|
+
return this.request("/account");
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export class HumantextApiError extends Error {
|
|
50
|
+
status;
|
|
51
|
+
code;
|
|
52
|
+
balance;
|
|
53
|
+
required;
|
|
54
|
+
constructor(message, status, code, balance, required) {
|
|
55
|
+
super(message);
|
|
56
|
+
this.name = "HumantextApiError";
|
|
57
|
+
this.status = status;
|
|
58
|
+
this.code = code;
|
|
59
|
+
this.balance = balance;
|
|
60
|
+
this.required = required;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,gBAAgB,GAAG,8BAA8B,CAAC;AA2CxD,MAAM,OAAO,kBAAkB;IACrB,MAAM,CAAS;IACf,OAAO,CAAS;IAExB,YAAY,MAAc,EAAE,OAAgB;QAC1C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,gBAAgB,CAAC;IAC7C,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,QAAgB,EAChB,UAAuB,EAAE;QAEzB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,GAAG,OAAO;YACV,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,WAAW,EAAE,IAAI,CAAC,MAAM;gBACxB,UAAU,EAAE,YAAY;gBACxB,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;aAC3B;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,IAAgB,CAAC;YAC/B,MAAM,IAAI,iBAAiB,CACzB,KAAK,CAAC,KAAK,IAAI,aAAa,QAAQ,CAAC,MAAM,EAAE,EAC7C,QAAQ,CAAC,MAAM,EACf,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,QAAQ,CACf,CAAC;QACJ,CAAC;QAED,OAAO,IAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAe,SAAS,EAAE;YAC3C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,OAAe,EACf,OAAuD;QAEvD,OAAO,IAAI,CAAC,OAAO,CAAiB,WAAW,EAAE;YAC/C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,OAAO;gBACP,GAAG,OAAO;aACX,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,CAAC,OAAO,CAAgB,UAAU,CAAC,CAAC;IACjD,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,MAAM,CAAS;IACf,IAAI,CAAU;IACd,OAAO,CAAU;IACjB,QAAQ,CAAU;IAElB,YACE,OAAe,EACf,MAAc,EACd,IAAa,EACb,OAAgB,EAChB,QAAiB;QAEjB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* humantext.pro MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Provides AI text detection and humanization tools via the Model Context Protocol.
|
|
6
|
+
* Works with Claude Code, Cursor, Windsurf, and any MCP-compatible client.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* npx @humantext/mcp-server
|
|
10
|
+
*
|
|
11
|
+
* Configuration:
|
|
12
|
+
* HUMANTEXT_API_KEY - Your API key from humantext.pro/api
|
|
13
|
+
* HUMANTEXT_BASE_URL - Optional custom API base URL
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* humantext.pro MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Provides AI text detection and humanization tools via the Model Context Protocol.
|
|
6
|
+
* Works with Claude Code, Cursor, Windsurf, and any MCP-compatible client.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* npx @humantext/mcp-server
|
|
10
|
+
*
|
|
11
|
+
* Configuration:
|
|
12
|
+
* HUMANTEXT_API_KEY - Your API key from humantext.pro/api
|
|
13
|
+
* HUMANTEXT_BASE_URL - Optional custom API base URL
|
|
14
|
+
*/
|
|
15
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
16
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
17
|
+
import { z } from "zod";
|
|
18
|
+
import { HumantextApiClient, HumantextApiError, } from "./api-client.js";
|
|
19
|
+
// --- Configuration ---
|
|
20
|
+
const API_KEY = process.env.HUMANTEXT_API_KEY;
|
|
21
|
+
const BASE_URL = process.env.HUMANTEXT_BASE_URL;
|
|
22
|
+
if (!API_KEY) {
|
|
23
|
+
console.error("Error: HUMANTEXT_API_KEY environment variable is required.\n" +
|
|
24
|
+
"Get your API key at: https://humantext.pro/api\n\n" +
|
|
25
|
+
"Add to your MCP config:\n" +
|
|
26
|
+
' "env": { "HUMANTEXT_API_KEY": "your_key_here" }');
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
const client = new HumantextApiClient(API_KEY, BASE_URL);
|
|
30
|
+
// --- Helper ---
|
|
31
|
+
function formatError(error) {
|
|
32
|
+
if (error instanceof HumantextApiError) {
|
|
33
|
+
switch (error.code) {
|
|
34
|
+
case "INSUFFICIENT_BALANCE":
|
|
35
|
+
return [
|
|
36
|
+
`Insufficient credits. Balance: ${error.balance} words, required: ${error.required} words.`,
|
|
37
|
+
``,
|
|
38
|
+
`Buy more credits: https://humantext.pro/pricing`,
|
|
39
|
+
`Buy a word pack: https://humantext.pro/buy-words`,
|
|
40
|
+
].join("\n");
|
|
41
|
+
case "INVALID_API_KEY":
|
|
42
|
+
return [
|
|
43
|
+
`Invalid or missing API key.`,
|
|
44
|
+
``,
|
|
45
|
+
`Get your API key: https://humantext.pro/api`,
|
|
46
|
+
`Setup guide: https://www.npmjs.com/package/@humantext/mcp-server`,
|
|
47
|
+
].join("\n");
|
|
48
|
+
case "SUBSCRIPTION_REQUIRED":
|
|
49
|
+
return [
|
|
50
|
+
`Active subscription required to use the API.`,
|
|
51
|
+
``,
|
|
52
|
+
`Subscribe: https://humantext.pro/pricing`,
|
|
53
|
+
].join("\n");
|
|
54
|
+
case "SUBSCRIPTION_CANCELLED":
|
|
55
|
+
return [
|
|
56
|
+
`Your subscription has been cancelled.`,
|
|
57
|
+
``,
|
|
58
|
+
`Resubscribe: https://humantext.pro/pricing`,
|
|
59
|
+
`Manage subscription: https://humantext.pro/manage-subscription`,
|
|
60
|
+
].join("\n");
|
|
61
|
+
case "SUBSCRIPTION_PAUSED":
|
|
62
|
+
return [
|
|
63
|
+
`Your subscription is currently paused.`,
|
|
64
|
+
``,
|
|
65
|
+
`Resume subscription: https://humantext.pro/manage-subscription`,
|
|
66
|
+
].join("\n");
|
|
67
|
+
case "RATE_LIMITED":
|
|
68
|
+
return "Rate limit exceeded. Please wait a moment and try again.";
|
|
69
|
+
case "GATEWAY_TIMEOUT":
|
|
70
|
+
case "BAD_GATEWAY":
|
|
71
|
+
return "Service temporarily unavailable. Please try again in a moment.";
|
|
72
|
+
default:
|
|
73
|
+
return error.message;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return error instanceof Error ? error.message : "Unknown error occurred";
|
|
77
|
+
}
|
|
78
|
+
function scoreVerdict(score) {
|
|
79
|
+
if (score < 0.15)
|
|
80
|
+
return "Human Written";
|
|
81
|
+
if (score < 0.50)
|
|
82
|
+
return "Mostly Human";
|
|
83
|
+
if (score < 0.75)
|
|
84
|
+
return "Likely AI";
|
|
85
|
+
return "AI Generated";
|
|
86
|
+
}
|
|
87
|
+
// --- MCP Server ---
|
|
88
|
+
const server = new McpServer({
|
|
89
|
+
name: "humantext",
|
|
90
|
+
version: "1.0.0",
|
|
91
|
+
});
|
|
92
|
+
// Tool: detect_ai
|
|
93
|
+
server.tool("detect_ai", "Check if text is AI-generated. Returns an AI probability score (0-100%) and verdict. Useful for checking content before publishing.", {
|
|
94
|
+
text: z
|
|
95
|
+
.string()
|
|
96
|
+
.min(50, "Text must be at least 50 characters")
|
|
97
|
+
.describe("The text to analyze for AI-generated content"),
|
|
98
|
+
}, async ({ text }) => {
|
|
99
|
+
try {
|
|
100
|
+
const result = await client.detect(text);
|
|
101
|
+
const percentage = Math.round(result.score * 100);
|
|
102
|
+
const verdict = scoreVerdict(result.score);
|
|
103
|
+
return {
|
|
104
|
+
content: [
|
|
105
|
+
{
|
|
106
|
+
type: "text",
|
|
107
|
+
text: [
|
|
108
|
+
`AI Detection Result`,
|
|
109
|
+
`━━━━━━━━━━━━━━━━━━━`,
|
|
110
|
+
`Score: ${percentage}% AI`,
|
|
111
|
+
`Verdict: ${verdict}`,
|
|
112
|
+
`Words analyzed: ${result.word_count}`,
|
|
113
|
+
`Credits remaining: ${result.credits_remaining}`,
|
|
114
|
+
].join("\n"),
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
return {
|
|
121
|
+
content: [{ type: "text", text: formatError(error) }],
|
|
122
|
+
isError: true,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
// Tool: humanize_text
|
|
127
|
+
server.tool("humanize_text", "Transform AI-generated text to sound natural and human-written. Preserves meaning while improving readability. Use this after writing content with AI to make it sound authentic.", {
|
|
128
|
+
text: z
|
|
129
|
+
.string()
|
|
130
|
+
.min(50, "Text must be at least 50 characters")
|
|
131
|
+
.describe("The AI-generated text to humanize"),
|
|
132
|
+
tone: z
|
|
133
|
+
.enum(["casual", "standard", "academic", "professional", "marketing"])
|
|
134
|
+
.optional()
|
|
135
|
+
.describe("Writing tone (default: standard)"),
|
|
136
|
+
style: z
|
|
137
|
+
.enum([
|
|
138
|
+
"general", "essay", "article", "marketing",
|
|
139
|
+
"creative", "formal", "report", "business", "legal",
|
|
140
|
+
])
|
|
141
|
+
.optional()
|
|
142
|
+
.describe("Content style (default: general)"),
|
|
143
|
+
level: z
|
|
144
|
+
.enum(["light", "balanced", "aggressive"])
|
|
145
|
+
.optional()
|
|
146
|
+
.describe("Humanization intensity — light preserves more original wording, aggressive makes maximum changes (default: aggressive)"),
|
|
147
|
+
}, async ({ text, tone, style, level }) => {
|
|
148
|
+
try {
|
|
149
|
+
const result = await client.humanize(text, {
|
|
150
|
+
tone: tone,
|
|
151
|
+
style: style,
|
|
152
|
+
level: level,
|
|
153
|
+
});
|
|
154
|
+
return {
|
|
155
|
+
content: [
|
|
156
|
+
{
|
|
157
|
+
type: "text",
|
|
158
|
+
text: [
|
|
159
|
+
`Humanized Text`,
|
|
160
|
+
`━━━━━━━━━━━━━━`,
|
|
161
|
+
``,
|
|
162
|
+
result.output,
|
|
163
|
+
``,
|
|
164
|
+
`━━━━━━━━━━━━━━`,
|
|
165
|
+
`Words: ${result.word_count} | Credits remaining: ${result.credits_remaining}`,
|
|
166
|
+
].join("\n"),
|
|
167
|
+
},
|
|
168
|
+
],
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
return {
|
|
173
|
+
content: [{ type: "text", text: formatError(error) }],
|
|
174
|
+
isError: true,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
// Tool: humanize_and_detect
|
|
179
|
+
server.tool("humanize_and_detect", "Humanize text AND verify the result with AI detection. Two-step process: first humanizes the text, then checks the humanized version to prove it passes AI detection. Best for when you need guaranteed results.", {
|
|
180
|
+
text: z
|
|
181
|
+
.string()
|
|
182
|
+
.min(50, "Text must be at least 50 characters")
|
|
183
|
+
.describe("The AI-generated text to humanize and verify"),
|
|
184
|
+
tone: z
|
|
185
|
+
.enum(["casual", "standard", "academic", "professional", "marketing"])
|
|
186
|
+
.optional()
|
|
187
|
+
.describe("Writing tone (default: standard)"),
|
|
188
|
+
style: z
|
|
189
|
+
.enum([
|
|
190
|
+
"general", "essay", "article", "marketing",
|
|
191
|
+
"creative", "formal", "report", "business", "legal",
|
|
192
|
+
])
|
|
193
|
+
.optional()
|
|
194
|
+
.describe("Content style (default: general)"),
|
|
195
|
+
level: z
|
|
196
|
+
.enum(["light", "balanced", "aggressive"])
|
|
197
|
+
.optional()
|
|
198
|
+
.describe("Humanization intensity (default: aggressive)"),
|
|
199
|
+
}, async ({ text, tone, style, level }) => {
|
|
200
|
+
try {
|
|
201
|
+
// Step 1: Humanize
|
|
202
|
+
const humanized = await client.humanize(text, {
|
|
203
|
+
tone: tone,
|
|
204
|
+
style: style,
|
|
205
|
+
level: level,
|
|
206
|
+
});
|
|
207
|
+
// Step 2: Detect the humanized result
|
|
208
|
+
const detection = await client.detect(humanized.output);
|
|
209
|
+
const percentage = Math.round(detection.score * 100);
|
|
210
|
+
const verdict = scoreVerdict(detection.score);
|
|
211
|
+
return {
|
|
212
|
+
content: [
|
|
213
|
+
{
|
|
214
|
+
type: "text",
|
|
215
|
+
text: [
|
|
216
|
+
`Humanized & Verified`,
|
|
217
|
+
`━━━━━━━━━━━━━━━━━━━━`,
|
|
218
|
+
``,
|
|
219
|
+
humanized.output,
|
|
220
|
+
``,
|
|
221
|
+
`━━━━━━━━━━━━━━━━━━━━`,
|
|
222
|
+
`Verification: ${percentage}% AI → ${verdict}`,
|
|
223
|
+
`Words: ${humanized.word_count} | Credits remaining: ${detection.credits_remaining}`,
|
|
224
|
+
].join("\n"),
|
|
225
|
+
},
|
|
226
|
+
],
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
return {
|
|
231
|
+
content: [{ type: "text", text: formatError(error) }],
|
|
232
|
+
isError: true,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
// Tool: check_balance
|
|
237
|
+
server.tool("check_balance", "Check your humantext.pro account balance, plan, and remaining credits.", {}, async () => {
|
|
238
|
+
try {
|
|
239
|
+
const result = await client.account();
|
|
240
|
+
return {
|
|
241
|
+
content: [
|
|
242
|
+
{
|
|
243
|
+
type: "text",
|
|
244
|
+
text: [
|
|
245
|
+
`Account: ${result.email}`,
|
|
246
|
+
`Plan: ${result.plan}${result.subscription_status ? ` (${result.subscription_status})` : ""}`,
|
|
247
|
+
`Credits: ${result.credits.total.toLocaleString()} words`,
|
|
248
|
+
` Subscription: ${result.credits.subscription.toLocaleString()}`,
|
|
249
|
+
` Package: ${result.credits.package.toLocaleString()}`,
|
|
250
|
+
`Max words/request: ${result.limits.words_per_request.toLocaleString()}`,
|
|
251
|
+
].join("\n"),
|
|
252
|
+
},
|
|
253
|
+
],
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
return {
|
|
258
|
+
content: [{ type: "text", text: formatError(error) }],
|
|
259
|
+
isError: true,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
// --- Start server ---
|
|
264
|
+
async function main() {
|
|
265
|
+
const transport = new StdioServerTransport();
|
|
266
|
+
await server.connect(transport);
|
|
267
|
+
}
|
|
268
|
+
main().catch((error) => {
|
|
269
|
+
console.error("Failed to start MCP server:", error);
|
|
270
|
+
process.exit(1);
|
|
271
|
+
});
|
|
272
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@humantext/mcp-server",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP server for AI text detection and humanization via humantext.pro",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"humantext-mcp": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"dev": "tsx src/index.ts",
|
|
13
|
+
"start": "node dist/index.js",
|
|
14
|
+
"prepublishOnly": "npm run build"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"mcp",
|
|
18
|
+
"model-context-protocol",
|
|
19
|
+
"ai-detector",
|
|
20
|
+
"ai-humanizer",
|
|
21
|
+
"humantext",
|
|
22
|
+
"claude",
|
|
23
|
+
"cursor",
|
|
24
|
+
"windsurf",
|
|
25
|
+
"text-humanizer",
|
|
26
|
+
"ai-content-detector"
|
|
27
|
+
],
|
|
28
|
+
"author": "humantext.pro",
|
|
29
|
+
"license": "MIT",
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "https://github.com/humantext/mcp-server"
|
|
33
|
+
},
|
|
34
|
+
"homepage": "https://humantext.pro",
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": ">=18"
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"dist/**/*",
|
|
40
|
+
"README.md",
|
|
41
|
+
"LICENSE"
|
|
42
|
+
],
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"@modelcontextprotocol/sdk": "^1.12.0"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"typescript": "^5.7.0",
|
|
48
|
+
"tsx": "^4.19.0",
|
|
49
|
+
"@types/node": "^22.0.0"
|
|
50
|
+
}
|
|
51
|
+
}
|