crypto-tools-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 +21 -0
- package/dist/api.js +23 -0
- package/dist/index.js +4 -0
- package/dist/server.js +38 -0
- package/package.json +45 -0
- package/server.json +20 -0
package/README.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Crypto Tools MCP
|
|
2
|
+
|
|
3
|
+
Hash and sign text locally with standard algorithms from the Node crypto library. No network, no key, nothing leaves the machine.
|
|
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
|
+
* `hash` Hash text.
|
|
11
|
+
* `hmac` Compute an HMAC.
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install
|
|
17
|
+
npm run build
|
|
18
|
+
node dist/index.js
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Hashes are computed with the Node crypto library. These tools are for checksums and verification, not for storing passwords.
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { createHash, createHmac } from "node:crypto";
|
|
2
|
+
const UA = "mrfentmen-crypto-tools-mcp/1.0";
|
|
3
|
+
export class CryptoError extends Error {
|
|
4
|
+
}
|
|
5
|
+
const ALGOS = ["md5", "sha1", "sha256", "sha512"];
|
|
6
|
+
export async function hash(args) {
|
|
7
|
+
const text = (args.text ?? "");
|
|
8
|
+
if (!text)
|
|
9
|
+
throw new CryptoError("Provide input text");
|
|
10
|
+
const algo = (args.algorithm ?? "sha256").toLowerCase();
|
|
11
|
+
if (!ALGOS.includes(algo))
|
|
12
|
+
throw new CryptoError(`Algorithm must be one of ${ALGOS.join(", ")}`);
|
|
13
|
+
const out = createHash(algo).update(text, "utf-8").digest("hex");
|
|
14
|
+
return `${algo} of "${text}":\n${out}`;
|
|
15
|
+
}
|
|
16
|
+
export async function hmac(args) {
|
|
17
|
+
const text = (args.text ?? "");
|
|
18
|
+
const key = (args.key ?? "");
|
|
19
|
+
if (!text || !key)
|
|
20
|
+
throw new CryptoError("Provide both text and a secret key");
|
|
21
|
+
const out = createHmac("sha256", key).update(text, "utf-8").digest("hex");
|
|
22
|
+
return `HMAC-SHA256 of "${text}":\n${out}`;
|
|
23
|
+
}
|
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,38 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { hash } from "./api.js";
|
|
4
|
+
import { hmac } from "./api.js";
|
|
5
|
+
const text = (value) => ({ content: [{ type: "text", text: value }] });
|
|
6
|
+
const textError = (t) => ({ content: [{ type: "text", text: t }], isError: true });
|
|
7
|
+
const READ_ONLY = { readOnlyHint: true, openWorldHint: true };
|
|
8
|
+
const error = (e) => `Error: ${e instanceof Error ? e.message : String(e)}`;
|
|
9
|
+
export function createServer() {
|
|
10
|
+
const server = new McpServer({ name: "crypto-tools-mcp", version: "1.0.0" });
|
|
11
|
+
server.registerTool("hash", {
|
|
12
|
+
title: "Hash",
|
|
13
|
+
description: "Hash text with an algorithm.",
|
|
14
|
+
inputSchema: z.object({ text: z.string().describe("Input text."), algorithm: z.string().describe("md5, sha1, sha256, or sha512.").optional() }),
|
|
15
|
+
annotations: READ_ONLY,
|
|
16
|
+
}, async (args) => {
|
|
17
|
+
try {
|
|
18
|
+
return text(await hash(args));
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
return textError(error(e));
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
server.registerTool("hmac", {
|
|
25
|
+
title: "Hmac",
|
|
26
|
+
description: "Compute an HMAC for text.",
|
|
27
|
+
inputSchema: z.object({ text: z.string().describe("Input text."), key: z.string().describe("Secret key.") }),
|
|
28
|
+
annotations: READ_ONLY,
|
|
29
|
+
}, async (args) => {
|
|
30
|
+
try {
|
|
31
|
+
return text(await hmac(args));
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
return textError(error(e));
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
return server;
|
|
38
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1.0.0",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "https://github.com/mrfentmen/crypto-tools-mcp.git"
|
|
7
|
+
},
|
|
8
|
+
"bin": {
|
|
9
|
+
"crypto-tools-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
|
+
"zxcvbn": "^4.4.2"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@types/node": "^22.0.0",
|
|
30
|
+
"typescript": "^5.6.0"
|
|
31
|
+
},
|
|
32
|
+
"name": "crypto-tools-mcp",
|
|
33
|
+
"description": "Hash, sign, and encrypt text locally with standard algorithms. No network and no key.",
|
|
34
|
+
"mcpName": "io.github.mrfentmen/crypto-tools-mcp",
|
|
35
|
+
"keywords": [
|
|
36
|
+
"mcp",
|
|
37
|
+
"crypto",
|
|
38
|
+
"hash",
|
|
39
|
+
"encrypt",
|
|
40
|
+
"security"
|
|
41
|
+
],
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=20"
|
|
44
|
+
}
|
|
45
|
+
}
|
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/crypto-tools-mcp",
|
|
4
|
+
"description": "Hash, sign, and encrypt text locally with standard algorithms. No network and no key.",
|
|
5
|
+
"repository": {
|
|
6
|
+
"url": "https://github.com/mrfentmen/crypto-tools-mcp",
|
|
7
|
+
"source": "github"
|
|
8
|
+
},
|
|
9
|
+
"version": "1.0.0",
|
|
10
|
+
"packages": [
|
|
11
|
+
{
|
|
12
|
+
"registryType": "npm",
|
|
13
|
+
"identifier": "crypto-tools-mcp",
|
|
14
|
+
"version": "1.0.0",
|
|
15
|
+
"transport": {
|
|
16
|
+
"type": "stdio"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|