disify-mcp 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/README.md +20 -0
- package/dist/api.js +21 -0
- package/dist/index.js +4 -0
- package/dist/server.js +24 -0
- package/package.json +44 -0
- package/server.json +20 -0
package/README.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Disify MCP
|
|
2
|
+
|
|
3
|
+
Email validation from the public Disify API. No key required.
|
|
4
|
+
|
|
5
|
+
This file is self contained. It reads public data only and never writes to the machine. All output is bounded and honest about what could not be fetched.
|
|
6
|
+
|
|
7
|
+
## Tools
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
* `check` Validate an email.
|
|
11
|
+
|
|
12
|
+
## Usage
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install
|
|
16
|
+
npm run build
|
|
17
|
+
node dist/index.js
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Data comes from the public Disify API.
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const BASE = 'https://www.disify.com/api/email';
|
|
2
|
+
export async function check(args) {
|
|
3
|
+
const email = (args.email ?? '').trim().toLowerCase();
|
|
4
|
+
if (!email || !email.includes('@'))
|
|
5
|
+
return 'Provide a valid email address.';
|
|
6
|
+
const res = await fetch(`${BASE}/${encodeURIComponent(email)}`, {
|
|
7
|
+
headers: { 'User-Agent': 'mrfentmen-disify-mcp/1.0', Accept: 'application/json' },
|
|
8
|
+
signal: AbortSignal.timeout(20000),
|
|
9
|
+
});
|
|
10
|
+
if (!res.ok)
|
|
11
|
+
throw new Error(`Disify returned ${res.status}`);
|
|
12
|
+
const d = (await res.json());
|
|
13
|
+
const s = (k) => (d[k] != null ? String(d[k]) : '');
|
|
14
|
+
return [
|
|
15
|
+
`Email: ${email}`,
|
|
16
|
+
`Format valid: ${s('format')}`,
|
|
17
|
+
`Disposable: ${s('disposable')}`,
|
|
18
|
+
`DNS records: ${s('dns')}`,
|
|
19
|
+
d.disposable === true ? 'Warning: this is a disposable email address.' : '',
|
|
20
|
+
].filter(Boolean).join('\n');
|
|
21
|
+
}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
2
|
+
import { createServer } from "./server.js";
|
|
3
|
+
const main = async () => { const server = createServer(); await server.connect(new StdioServerTransport()); };
|
|
4
|
+
main().catch((error) => { console.error("Fatal error:", error); process.exit(1); });
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { check } from "./api.js";
|
|
4
|
+
const text = (value) => ({ content: [{ type: "text", text: value }] });
|
|
5
|
+
const textError = (t) => ({ content: [{ type: "text", text: t }], isError: true });
|
|
6
|
+
const READ_ONLY = { readOnlyHint: true, openWorldHint: true };
|
|
7
|
+
const error = (e) => `Error: ${e instanceof Error ? e.message : String(e)}`;
|
|
8
|
+
export function createServer() {
|
|
9
|
+
const server = new McpServer({ name: "disify-mcp", version: "1.0.0" });
|
|
10
|
+
server.registerTool("check", {
|
|
11
|
+
title: "Check",
|
|
12
|
+
description: "Validate an email address.",
|
|
13
|
+
inputSchema: z.object({ email: z.string().describe("Email address.") }),
|
|
14
|
+
annotations: READ_ONLY,
|
|
15
|
+
}, async (args) => {
|
|
16
|
+
try {
|
|
17
|
+
return text(await check(args));
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
20
|
+
return textError(error(e));
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
return server;
|
|
24
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1.0.0",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "https://github.com/mrfentmen/disify-mcp.git"
|
|
7
|
+
},
|
|
8
|
+
"bin": {
|
|
9
|
+
"disify-mcp": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"main": "./dist/index.js",
|
|
12
|
+
"files": [
|
|
13
|
+
"dist",
|
|
14
|
+
"server.json",
|
|
15
|
+
"README.md"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc -p tsconfig.json",
|
|
19
|
+
"start": "node dist/index.js",
|
|
20
|
+
"dev": "npm run build && node dist/index.js"
|
|
21
|
+
},
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
25
|
+
"zod": "^3.23.8"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/node": "^22.0.0",
|
|
29
|
+
"typescript": "^5.6.0"
|
|
30
|
+
},
|
|
31
|
+
"name": "disify-mcp",
|
|
32
|
+
"description": "Email validation from Disify. No key required.",
|
|
33
|
+
"mcpName": "io.github.mrfentmen/disify-mcp",
|
|
34
|
+
"keywords": [
|
|
35
|
+
"mcp",
|
|
36
|
+
"disify",
|
|
37
|
+
"email",
|
|
38
|
+
"validation",
|
|
39
|
+
"security"
|
|
40
|
+
],
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=20"
|
|
43
|
+
}
|
|
44
|
+
}
|
package/server.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
3
|
+
"name": "io.github.mrfentmen/disify-mcp",
|
|
4
|
+
"description": "Email validation from Disify. No key required.",
|
|
5
|
+
"repository": {
|
|
6
|
+
"url": "https://github.com/mrfentmen/disify-mcp",
|
|
7
|
+
"source": "github"
|
|
8
|
+
},
|
|
9
|
+
"version": "1.0.0",
|
|
10
|
+
"packages": [
|
|
11
|
+
{
|
|
12
|
+
"registryType": "npm",
|
|
13
|
+
"identifier": "disify-mcp",
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"transport": {
|
|
16
|
+
"type": "stdio"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|