Skip to main content
Glama
igorgrv1

@igorromero/ciphersuite-mcp

by igorgrv1

ciphersuite-mcp

AES-256-CBC 暗号化・復号化ツール、各アルゴリズムを説明するリソース、すぐに使えるプロンプトを提供する MCP (Model Context Protocol) サーバーです。これらはすべて VS Code Copilot Chat 内で直接実行できます。

tools

Related MCP server: @erickwendel/ciphersuite-mcp

機能

種別

名前

説明

🔧 ツール

encrypt_message

任意の平文メッセージをパスフレーズで暗号化します

🔧 ツール

decrypt_message

以前暗号化したメッセージを同じパスフレーズで復号化します

📄 リソース

encryption://info

暗号化アルゴリズム、鍵導出、出力形式に関する詳細を返します

📄 リソース

decryption://info

復号化ツールの使い方を返します(期待される形式、パスフレーズのルール、よくあるエラー)

💬 プロンプト

encrypt_message_prompt

エージェントにメッセージの暗号化を依頼するビルド済みプロンプトです

💬 プロンプト

decrypt_message_prompt

エージェントにメッセージの復号化を依頼するビルド済みプロンプトです

暗号化の仕組み

  • アルゴリズム: AES-256-CBC

  • 鍵導出: scrypt(passphrase, fixedSalt, 32) — 任意のパスフレーズ文字列を渡すと、サーバーが強力な32バイトの鍵を自動的に導出します

  • 出力形式: <IV(16進数)>:<暗号文(16進数)> — 後で復号化するために、完全な文字列を保持してください

  • IV: 暗号化のたびに新しいランダムな16バイトの IV が生成されるため、同じメッセージを2回暗号化すると異なる出力になります


前提条件

  • Node.js v24+(package.json の engines を参照)


インストール

npm install

ビルド手順は不要です。Node.js のネイティブ TypeScript サポートにより、サーバーは TypeScript を直接実行します。


VS Code での使用方法

1. MCP サーバー設定を追加する

ワークスペース内の .vscode/mcp.json を作成(または開いて)、次のように追加します:

{
  "servers": {
    "ciphersuite-mcp": {
      "command": "node",
      "args": ["--experimental-strip-types", "ABSOLUTE_PATH_TO_PROJECT/src/index.ts"]
    }
  }
}

または npm 経由:

{
  "servers": {
    "ciphersuite-mcp": {
      "command": "npx",
      "args": ["-y", "@igorromero/ciphersuite-mcp"]
    }
  }
}

ヒント: このサーバーを ~/.vscode/mcp.json のユーザーレベル MCP 設定に追加すると、すべてのワークスペースで利用できるようになります。

2. VS Code をリロードする

コマンドパレット(Cmd+Shift+P)を開き、Developer: Reload Window を実行します(または VS Code を再起動するだけでも構いません)。

3. Copilot Chat で使用する

Copilot Chat(エージェントモード)を開いて、次を試してください:

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 resource

エージェントが適切なツールを自動的に呼び出し、結果を返します。


MCP Inspector を実行する

MCP Inspector を使用すると、ブラウザ UI でツール、リソース、プロンプトをすべて対話的に探索・テストできます:

npm run mcp:inspect

これにより、http://localhost:5173 でインスペクタが起動し、実行中のサーバーに接続されます。


テストを実行する

# Run all tests once
npm test

# Run tests in watch mode (with debugger)
npm run test:dev

テストスイートの対象は次のとおりです:

  • メッセージの暗号化

  • 正しいパスフレーズでのメッセージの復号化

  • encryption://info リソースの一覧表示と読み取り

  • 両方のプロンプトの取得

  • エラー: 誤ったパスフレーズでの復号化

  • エラー: 不正な形式の暗号文の復号化


プロジェクト構成

src/
  index.ts   # Entry point — connects the server to stdio transport
  mcp.ts     # All tools, resources, and prompts are registered here
tests/
  mcp.test.ts

利用可能なスクリプト

スクリプト

説明

npm start

サーバーを起動します(MCP クライアントが使用)

npm run dev

ファイル監視と Node.js インスペクタ付きで起動します

npm test

すべてのテストを実行します

npm run test:dev

ウォッチモードでテストを実行します

npm run mcp:inspect

MCP Inspector UI を開きます



ゼロから作成する

このセクションでは、この MCP サーバーを段階的に構築した方法を説明します — 将来新しい MCP サーバーを作成する際に役立ちます。

MCP トランスポートの種類

MCP トランスポートには3種類あります:

種類

クラス

説明

stdio

StdioServerTransport

マシン上でローカルに実行されます — ローカルツールでは最も一般的です

http

—

HTTP 経由の API として実行されます

sse

—

Server-Sent Events — データをオンデマンド(ストリーミング)で処理します

依存関係

// package.json
"dependencies": {
  "@modelcontextprotocol/sdk": "^1.27.1",
  "@types/node": "^24.11.0",
  "zod": "^3.25.76"
}

1. エントリポイント — src/index.ts

エントリポイントは StdioServerTransport を作成し、MCP サーバーをそれに接続します:

// 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. サーバーのセットアップ — src/mcp.ts

名前とバージョンを指定して MCP サーバーインスタンスを作成します:

// 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. ツールの登録

tools

ツールは、LLM がアクションを実行するために呼び出せる関数です。3つの引数を取る server.registerTool を使用します:

  1. ツールの名前(文字列)

  2. 次を含む設定オブジェクト:

    • description — ツールが何をするか。LLM はこれを参照して呼び出しタイミングを判断します

    • inputSchema — リクエストボディに相当し、Zod で定義します

    • outputSchema — レスポンスボディに相当し、Zod で定義します

  3. 非同期ハンドラー関数 — 実際の実装

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)}`
                }]
            }
        }
    }
)

decrypt_message にも同じパターンが当てはまります。入出力スキーマのフィールドを入れ替えて、代わりに decrypt() を呼び出すだけです。


4. リソースの登録

resource

リソースは、LLM がツールの周辺コンテキストを理解するのに役立つ、静的または計算済みの情報を提供します。4つの引数を取る server.registerResource を使用します:

  1. リソースの名前

  2. URI テンプレート(通常は名前と同じ)

  3. description を含む設定オブジェクト

  4. contents を返すハンドラー関数 — uri、mimeType、text を持つオブジェクトの配列

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(),
            },
        ]
    })
)

decryption://info リソースも同じパターンで、復号化ツールの期待される入力形式、パスフレーズの要件、よくあるエラーシナリオを説明します。


5. プロンプトの登録

prompt

プロンプトは、LLM がガイド付きでツールを呼び出すために使用できる、ビルド済みのメッセージテンプレートです。3つの引数を取る server.registerPrompt を使用します:

  1. プロンプトの名前

  2. 次を含む設定オブジェクト:

    • description — プロンプトが何をするか

    • argsSchema — 入力パラメータ。Zod で定義します

  3. messages を返すハンドラー関数 — role(user または assistant)と content を持つオブジェクトの配列

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}`,
                }
            }
        ]
    })
)

decrypt_message_prompt も同じパターンです。encryptedMessage と encryptionKey を引数に取り、LLM に decrypt_message の呼び出しを指示します。


6. MCP サーバーを IDE に接続する

VS Code(自動)

プロジェクトルートに .vscode/mcp.json を作成します。VS Code が自動的に検出します:

{
    "servers": {
        "ciphersuite-mcp": {
            "command": "node",
            "args": [
                "--experimental-strip-types",
                "src/index.ts"
            ]
        }
    }
}

その他の IDE / その他のプロジェクト

ciphersuite-mcp サーバーのエントリを、対象のプロジェクトまたは IDE の MCP 設定ファイルにコピーします。サーバーは stdio 経由でサブプロセスとして実行されるため、MCP 互換のクライアントならどれでも接続できます。

Available Tools

2 tools
decrypt_messageA

Decrypt a message that was encrypted with the encrypt_message tool

NameRequiredDescriptionDefault
encryptionKeyYesThe same passphrase used during encryption
encryptedMessageYesThe encrypted message (format: iv:ciphertext)

Output Schema

NameRequiredDescription
decryptedMessageYesThe decrypted plain-text message

TDQS

A3.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavioral traits. It does not state whether the operation is read-only, has side effects, or what happens on failure (e.g., wrong key). The only behavioral detail is the requirement for the same passphrase, which partially addresses input constraints but not the tool's overall safety profile. This is a significant gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with zero filler. It states the verb, object, and connection to the sibling tool efficiently, making it easy to scan and understand quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity, full parameter coverage, and presence of an output schema, the description is mostly complete. It correctly identifies the key requirement and relationship to encrypt_message. However, lacking behavioral disclosure (e.g., error handling, purity) means it is not fully complete for an agent deciding to invoke it safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so each parameter already has a description. The tool description adds minimal semantic value beyond mentioning the key matches encrypt_message, which mirrors what the schema already states. This meets the baseline for full schema coverage but does not provide additional meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Decrypt') and resource ('a message'), and explicitly ties it to the encrypt_message tool, which differentiates it from the sibling. It is not a tautology; it names the exact operation and its counterpart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly implies usage context by referencing encrypt_message, indicating it is the decryption counterpart. However, it does not explicitly state when not to use it or name alternative tools beyond the implicit sibling relationship. This is clear context but lacks explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

encrypt_messageC

Encrypt a message

NameRequiredDescriptionDefault
messageYesThe message to encrypt
encryptionKeyYesAny passphrase to use for encryption — the server derives a strong key from it automatically

Output Schema

NameRequiredDescription
encryptedMessageYesThe encrypted message (format: iv:ciphertext)

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden for behavioral disclosure, but it only states the action. It does not mention that encryption is irreversible (without the key), the output format, or any side effects. The schema hints at key derivation, but the description itself adds no behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded, but it essentially restates the tool name without adding operational detail. While not verbose, it doesn't earn its place beyond the name—acceptable but minimal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite an output schema existing, the description is too sparse for an encryption operation. It lacks information about when encryption is appropriate, the nature of the output, or any warnings. The agent is left to infer everything from the schema and sibling naming, which is insufficient for correct invocation in varied contexts.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for both parameters, so the schema already documents 'message' and 'encryptionKey' with meaningful descriptions. The tool description adds no extra parameter information, but the baseline is 3 given high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Encrypt a message') with a specific verb and resource. It implicitly distinguishes from the sibling tool 'decrypt_message' by focusing on encryption, though it doesn't explicitly name the alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus decrypt_message or any other context. There is no mention of prerequisites, security considerations, or typical use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updatesv0.0.1
    • First observeddecrypt_message
    • First observedencrypt_message

TDQS

A3.6/5.0

Scored across 2 tools

Disambiguation5/5

The two tools are perfectly distinct: one encrypts, the other decrypts. There is no overlap or potential for confusion between them.

Naming Consistency5/5

Both tools follow the same verb_noun pattern: encrypt_message and decrypt_message. Naming is consistent and intuitive.

Tool Count4/5

At only 2 tools, the server is minimal, but the domain of encryption/decryption inherently requires exactly these two operations. The count is slightly under the typical 3-15 range but perfectly appropriate for its narrow scope.

Completeness5/5

The tool surface covers the full encryption/decryption lifecycle with no missing operations. For a cipher suite, encrypt and decrypt are the only necessary functions.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Enables AI memory persistence and secure credential management via vault tools for MCP-compatible clients like Claude Desktop, Cursor, and VS Code.
    12
    11 npm
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Provides AES-256-CBC encryption and decryption tools, a resource for algorithm details, and prompts for encrypting and decrypting messages, all runnable inside VS Code Copilot Chat.
    2
    ISC
  • A
    license
    C
    quality
    C
    maintenance
    Provides AES-256-CBC encryption and decryption tools, an algorithm info resource, and ready-to-use prompts for use in MCP-compatible clients like VS Code Copilot Chat.
    1
    ISC
  • A
    license
    C
    quality
    C
    maintenance
    Enables encrypting and decrypting plain-text messages with AES-256-CBC using any passphrase, with automatic scrypt key derivation and a fresh random IV per call. It also exposes a resource describing the algorithm and ready-to-use prompts, and can be run directly inside VS Code Copilot Chat or the MCP Inspector.
    2
    ISC