@igorromero/ciphersuite-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@igorromero/ciphersuite-mcpEncrypt the message 'Hello, World!' with passphrase 'my-secret-key'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ciphersuite-mcp
An MCP (Model Context Protocol) server that provides AES-256-CBC encryption and decryption tools, resources describing each algorithm, and ready-to-use prompts — all runnable directly inside VS Code Copilot Chat.
Related MCP server: Secret Vault MCP Server
What it does
Capability | Name | Description |
🔧 Tool |
| Encrypts any plain-text message with a passphrase |
🔧 Tool |
| Decrypts a previously encrypted message with the same passphrase |
📄 Resource |
| Returns details about the encryption algorithm, key derivation, and output format |
📄 Resource |
| Returns how to use the decrypt tool: expected format, passphrase rules, and common errors |
💬 Prompt |
| Pre-built prompt that asks the agent to encrypt a message |
💬 Prompt |
| Pre-built prompt that asks the agent to decrypt a message |
How encryption works
Algorithm: AES-256-CBC
Key derivation:
scrypt(passphrase, fixedSalt, 32)— you pass any passphrase string; the server derives a strong 32-byte key automaticallyOutput format:
<IV in hex>:<ciphertext in hex>— keep the full string to decrypt laterIV: a fresh random 16-byte IV is generated on every encryption call, so the same message encrypted twice produces different output
Prerequisites
Node.js v24+ (see
enginesinpackage.json)
Installation
npm installNo build step is needed — the server runs TypeScript directly via Node.js native TypeScript support.
Using in VS Code
1. Add the MCP server configuration
Create (or open) .vscode/mcp.json in your workspace and add:
{
"servers": {
"ciphersuite-mcp": {
"command": "node",
"args": ["--experimental-strip-types", "ABSOLUTE_PATH_TO_PROJECT/src/index.ts"]
}
}
}or via npm:
{
"servers": {
"ciphersuite-mcp": {
"command": "npx",
"args": ["-y", "@igorromero/ciphersuite-mcp"]
}
}
}Tip: You can also add this server to your user-level MCP config at
~/.vscode/mcp.jsonto make it available in every workspace.
2. Reload VS Code
Open the Command Palette (Cmd+Shift+P) and run Developer: Reload Window (or just restart VS Code).
3. Use it in Copilot Chat
Open Copilot Chat (Agent mode) and try:
Encrypt the message "Hello, World!" using the passphrase "my-secret-key"Decrypt this message: a3f1...:<ciphertext> using the passphrase "my-secret-key"Show me the encryption://info resourceThe agent will automatically call the appropriate tool and return the result.
Running the MCP Inspector
The MCP Inspector lets you explore and test all tools, resources, and prompts interactively in a browser UI:
npm run mcp:inspectThis opens the inspector at http://localhost:5173 and connects it to the running server.
Running tests
# Run all tests once
npm test
# Run tests in watch mode (with debugger)
npm run test:devThe test suite covers:
Encrypting a message
Decrypting a message with the correct passphrase
Listing and reading the
encryption://inforesourceFetching both prompts
Error: decrypting with the wrong passphrase
Error: decrypting a malformed ciphertext
Project structure
src/
index.ts # Entry point — connects the server to stdio transport
mcp.ts # All tools, resources, and prompts are registered here
tests/
mcp.test.tsAvailable scripts
Script | Description |
| Start the server (used by MCP clients) |
| Start with file-watch and Node.js inspector |
| Run all tests |
| Run tests in watch mode |
| Open the MCP Inspector UI |
Creating from Scratch
This section documents how this MCP server was built step by step — useful for creating new MCP servers in the future.
MCP Transport Types
There are 3 types of MCP transport:
Type | Class | Description |
|
| Runs locally on the machine — the most common for local tools |
| — | Runs as an API over HTTP |
| — | Server-Sent Events — processes data on demand (streaming) |
Dependencies
// package.json
"dependencies": {
"@modelcontextprotocol/sdk": "^1.27.1",
"@types/node": "^24.11.0",
"zod": "^3.25.76"
}1. Entry Point — src/index.ts
The entry point creates a StdioServerTransport and connects the MCP server to it:
// src/index.ts
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { server } from "./mcp.ts";
async function main() {
const transport = new StdioServerTransport()
await server.connect(transport)
console.error('Encrypt MCP Server running on stdio')
}
main().catch((error) => {
console.error("Fatal error in main():", error);
process.exit(1);
});2. Server Setup — src/mcp.ts
Create the MCP server instance with a name and version:
// src/mcp.ts
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
export const server = new McpServer({
name: '@igorromero/ciphersuite-mcp',
version: '0.0.1'
})3. Registering Tools

Tools are functions the LLM can call to perform actions. Use server.registerTool, which takes 3 arguments:
Name of the tool (string)
Config object containing:
description— what the tool does; the LLM uses this to decide when to call itinputSchema— equivalent to the request body, defined with ZodoutputSchema— equivalent to the response body, defined with Zod
Async handler function — the actual implementation
server.registerTool(
'encrypt_message',
{
description: 'Encrypt a message',
inputSchema: {
message: z.string().describe("The message to encrypt"),
encryptionKey: z.string().describe(
"Any passphrase to use for encryption — the server derives a strong key from it automatically"
)
},
outputSchema: {
encryptedMessage: z.string().describe(
"The encrypted message (format: iv:ciphertext)"
)
}
},
async ({ message, encryptionKey }) => {
try {
const encryptedMessage = encrypt(message, encryptionKey)
return {
content: [{ type: "text", text: encryptedMessage }],
structuredContent: { encryptedMessage }
}
} catch (error) {
return {
isError: true,
content: [{
type: 'text',
text: `Failed to encrypt message! Error: ${error instanceof Error ? error.message : String(error)}`
}]
}
}
}
)The same pattern applies to decrypt_message — just swap the input/output schema fields and call decrypt() instead.
4. Registering Resources

Resources provide static or computed information that helps the LLM understand the context around a tool. Use server.registerResource, which takes 4 arguments:
Name of the resource
URI template (usually the same as the name)
Config object containing a
descriptionHandler function that returns
contents— an array of objects withuri,mimeType, andtext
server.registerResource(
'encryption://info',
'encryption://info',
{
description: 'Describes the encryption algorithm, key requirements, and output format used by this server',
},
() => ({
contents: [
{
uri: "encryption://info",
mimeType: "text/plain",
text: `
Algorithm : AES-256-CBC
Key derivation: scrypt (passphrase + fixed server salt → 32-byte key)
Output format: <16-byte IV in hex>:<ciphertext in hex> (separated by ":")
Notes:
- Users pass any passphrase — the server derives a strong 32-byte key automatically using scrypt.
- A random IV is generated for every encryption — the same message encrypted twice will produce different output.
- Use the exact same passphrase to decrypt.
- Keep the full "iv:ciphertext" string to decrypt later.
`.trim(),
},
]
})
)The decryption://info resource follows the same pattern, describing the expected input format, passphrase requirements, and common error scenarios for the decrypt tool.
5. Registering Prompts

Prompts are pre-built message templates that the LLM can use to invoke tools in a guided way. Use server.registerPrompt, which takes 3 arguments:
Name of the prompt
Config object containing:
description— what the prompt doesargsSchema— the input parameters, defined with Zod
Handler function that returns
messages— an array of objects withrole(userorassistant) andcontent
server.registerPrompt(
"encrypt_message_prompt",
{
description: "Prompt to encrypt a plain-text message using the encrypt_message tool",
argsSchema: {
message: z.string().describe("The message to encrypt"),
encryptionKey: z.string().describe(
"Any passphrase to use for encryption — the server derives a strong key from it automatically"
)
}
},
({ message, encryptionKey }) => ({
messages: [
{
role: 'user',
content: {
type: "text",
text: `Please encrypt the following message using the encrypt_message tool.\nMessage: ${message}\nEncryption key: ${encryptionKey}`,
}
}
]
})
)The decrypt_message_prompt follows the same pattern — takes encryptedMessage and encryptionKey as args and instructs the LLM to call decrypt_message.
6. Connecting the MCP Server to an IDE
VS Code (automatic)
Create .vscode/mcp.json in the project root. VS Code will detect it automatically:
{
"servers": {
"ciphersuite-mcp": {
"command": "node",
"args": [
"--experimental-strip-types",
"src/index.ts"
]
}
}
}Other IDEs / Other Projects
Copy the ciphersuite-mcp server entry into the MCP config file of the target project or IDE. The server runs as a subprocess via stdio, so any MCP-compatible client can connect to it.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
AlicenseAqualityCmaintenanceEnables AI memory persistence and secure credential management via vault tools for MCP-compatible clients like Claude Desktop, Cursor, and VS Code.1217MIT- FlicenseNot gradedqualityCmaintenanceAES-256-GCM encrypted local secret storage exposed as MCP tools, with secrets captured via native OS dialogs and never passing through the LLM API.
- AlicenseNot gradedqualityCmaintenanceExposes OS keychain or AES-256-GCM encrypted file secrets as MCP tools, allowing reading, setting, and listing secrets without exposing values in conversation messages.10MIT
- AlicenseNot gradedqualityCmaintenanceMCP server for sovereign AES-256-GCM backup encryption and decryption. Enables encrypting, decrypting, verifying, and scoring passphrases with zero network calls.MIT
Related MCP Connectors
Production-grade cryptography toolkit with 31 MCP tools for classical, PQC, and KMS workflows.
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
MCP server teaching AI agents to implement TideCloak: auth, E2EE, IGA, security analysis
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/igorgrv1/AI-MCP-from-scratch'
If you have feedback or need assistance with the MCP directory API, please join our Discord server