Unicode Security MCP
Local checks for Unicode confusables, mixed scripts, invisible controls, and suspicious identifiers.
คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)
Security-focused MCP server for GnuPG signing, encryption and key management.
สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน
ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry
เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง
GPG_MCP_CONFIGต้องเตรียมก่อน
คุณใช้แอปไหน
เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”
เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json
{
"mcpServers": {
"gpg": {
"command": "uvx",
"args": [
"gpg-mcp",
"serve"
],
"env": {
"GPG_MCP_CONFIG": "ใส่ค่าของคุณ"
}
}
}
}พิมพ์คำสั่งนี้ใน Terminal
claude mcp add gpg --env GPG_MCP_CONFIG='ใส่ค่าของคุณ' -- uvx gpg-mcp serveเติมค่าที่เว้นว่างไว้ก่อนรัน
วางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json
{
"mcpServers": {
"gpg": {
"command": "uvx",
"args": [
"gpg-mcp",
"serve"
],
"env": {
"GPG_MCP_CONFIG": "ใส่ค่าของคุณ"
}
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
วางในไฟล์ .vscode/mcp.json ของโปรเจกต์
{
"servers": {
"gpg": {
"type": "stdio",
"command": "uvx",
"args": [
"gpg-mcp",
"serve"
],
"env": {
"GPG_MCP_CONFIG": "ใส่ค่าของคุณ"
}
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น
ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี
GPG_MCP_CONFIG envค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README
รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง
เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 8 พ.ย. 2569
ชื่อใน registry ยืนยันด้วยบัญชี GitHub emiliano-go ซึ่งเป็นเจ้าของ repo
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต
ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน
รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต
เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo
จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น
registry ไม่ได้ระบุว่าต้องใช้กุญแจ แต่บางตัวจะขอให้ล็อกอินตอนใช้ครั้งแรก
รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)
repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (0.1.0) เข้า registry 14 วันที่ผ่านมา
โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Python (uv) ในเครื่องด้วย
ในหมวดเดียวกันมี Unicode Security MCP, Osv MCP, Epss MCP
server หมวดเดียวกันจากผู้ทำคนอื่น เรียงตามดาว
อ่านการ์ด:↓ ดาวน์โหลดต่อสัปดาห์i★ ดาว GitHubiสามเสา: รีวิว · ผลตรวจ · การใช้งานiอัปเดต = วันที่ส่งรุ่นล่าสุดเข้า registryi
Local checks for Unicode confusables, mixed scripts, invisible controls, and suspicious identifiers.
Exploit Prediction Scoring System scores: how likely a CVE will be exploited in the next 30 days.
ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ
A security-focused Model Context Protocol server for GnuPG.
gpg-mcp lets an AI agent sign, verify, encrypt, decrypt and manage OpenPGP keys without ever receiving private key material. Private keys stay in gpg-agent; passphrases go only into pinentry; high-risk operations require an explicit human approval; destructive operations require typing a fingerprint suffix.
Threat model in one sentence: the MCP server is a policy boundary, not an OS sandbox. It
prevents the agent from *receiving* private keys and from silently using them. For protection
against an agent that already has shell access as the same OS user, run the signer as a separate
user or use a hardware token (see Stronger isolation).
Most “GPG MCP” wrappers are thin subprocess shells: any tool with a command: str parameter, or an agent that can ask for --export-secret-keys, defeats the point. gpg-mcp instead exposes a fixed, typed surface with deliberate omissions:
run_gpg(args) tool.--export-secret-keys, --export-secret-subkeys and --export-secret-ssh-key are unreachable.--passphrase, --passphrase-fd, --passphrase-file, no loopback pinentry, no passphrase in environment variables or stdin.gpg-agent.--pinentry-mode ask is forced; pinentry talks to the human directly. The server cannot read the passphrase from argv, env or stdin.~/.gnupg, an empty allow-list denies both. With a dedicated keyring, the keyring itself is the allow-list boundary.gpg --list-packets is used to confirm the ciphertext is addressed to an allowed key. Hidden recipients are refused by default, even when the same message also has a visible allowed recipient.verify=true (default) and the decrypted message carries a bad, expired or revoked signature, the plaintext is not returned. valid is the policy result; the cryptographic result is reported separately. Multiple signatures are aggregated per NEWSIG sequence — or per packet on GnuPG without --proc-all-sigs — and fail closed if any signature is not policy-acceptable, regardless of event order.sign_and_encrypt, and encrypt with sign_with) inherit the approval requirement of every constituent, so a policy that gates only signing or only encryption cannot be bypassed.apply=false is a true dry run and never touches the real keyring.destructive_confirmation and is independent of require_approval.execve-style argv arrays. No shell interpolation, no option injection from user strings.LD_*, GPG_AGENT_INFO, GPG_TTY, SSH_AUTH_SOCK and other variables are not passed to gpg. Only the display/session variables pinentry needs are kept.gpg, gpgconf and zenity are resolved to absolute paths, must be regular files, and must not be group/world writable. An unsafe zenity makes local approval fail closed instead of trusting a substituted dialog.import_public_key rejects secret-key packets and any revocation signature, including revocation signatures embedded in key material. Revocations must use import_revocation, where the target is validated and typed confirmation is required.DECRYPTION_KEY status must name an allowed primary or subkey; otherwise the plaintext is discarded. A ciphertext with an allowed visible recipient cannot silently decrypt through a different secret key.--no-options and --pinentry-mode ask, so a hostile gpg.conf cannot switch on loopback pinentry or change other security-relevant defaults.O_NOFOLLOW, and the opened file is validated through fstat, so validation and use cannot race or be redirected by a path swap. The keyring path is kept unresolved (GNUPGHOME is not symlink-resolved); serve, doctor and init validate its full ancestor chain and reject a symlinked keyring or ancestor. Ancestors must be owned by the user or root and must not be group/world writable without the sticky bit. Unknown keys are rejected. Existing audit files are fstated, non-regular/foreign-owned files are refused, and group/other access is tightened to 0600. With audit_required = true, an audit failure fails the operation. init securely creates the config with O_EXCL|O_NOFOLLOW and refuses a symlinked gpg-agent.conf instead of writing through or chmodding its target. Missing config, keyring and audit directories are created component-by-component relative to already validated directory descriptors, so a symlinked ancestor cannot redirect or create anything before rejection. The audit path uses the same directory-fd walk, so an unsafe ancestor cannot redirect the ledger.symmetric_decrypt rejects hybrid ciphertext that also carries public-key recipients. decrypt rejects symmetric-only ciphertext and refuses to return plaintext unless GnuPG reports an actual allow-listed public key; it never falls back to the symmetric route. A custom policy that gates only symmetric_decrypt therefore cannot be bypassed through decrypt. For hybrid input, only GnuPG's recoverable symmetric-passphrase failure is tolerated, and only when a public key also reported DECRYPTION_KEY and DECRYPTION_OKAY; generic ERROR/FAILURE events and unexplained nonzero exit codes are rejected.--proc-all-sigs. Cleartext, inline, and embedded signatures use --proc-all-sigs when supported. On older GnuPG a bad-first message may stop enumeration at the first bad signature, but it is still rejected; all-good messages enumerate every signature.DECRYPTION_OKAY, rejects DECRYPTION_FAILED, BADMDC, ERROR and FAILURE, and treats unexplained nonzero exits as fatal. With verify=false, a nonzero exit is tolerated only for an explicitly recognized embedded-signature outcome; unrelated GnuPG failures are never excused.verify (and the embedded-signature result returned by decrypt) separates four ideas:
| Field | Meaning |
|---|---|
cryptographically_valid | gpg emitted VALIDSIG; the signature math checks out |
policy_acceptable | additionally a GOODSIG with no expired signature, expired key, revoked key or missing public key |
valid | alias for policy_acceptable, retained for compatibility |
identity_trusted | signer has full or ultimate trust; reported separately, not required for acceptance |
Decryption releases plaintext only when every embedded signature is policy_acceptable. A mathematically valid but expired or revoked signature is never enough, and a bad signature cannot be hidden by a later good one. The result includes a signatures list with one entry per NEWSIG sequence.
~/.gnupg, connect to the gpg-agent socket, or edit ~/.config/gpg-mcp/config.toml. If the agent has shell access, the MCP policy is not an OS boundary. Use stronger isolation.approval = "client" mode, the client renders the approval dialog. A malicious client can fake it. Use approval = "local" (zenity, independent of the client) or a separate user/hardware token.| Threat | Control |
|---|---|
| Agent asks for the private key | No tool returns it; response guard blocks accidental output |
Agent tries --export-secret-keys | Option is never constructed; no raw exec |
| Agent supplies an option as a UID/fingerprint | Full-fingerprint validation; UIDs reject leading -/control characters, and key creation uses a parameter file |
| Agent signs a malicious tag/release silently | Allow-list + approval showing key, size, SHA-256 and preview |
| Agent decrypts stolen ciphertext | Allow-list + approval + recipient preflight |
| Agent encrypts secrets to an attacker key | Named recipients in approval + optional allowed_recipients |
| Agent imports a secret key | Secret packets detected and rejected |
| Agent deletes a key | destructiveHint + typed fingerprint suffix |
| Agent revokes a key | destructiveHint + typed fingerprint suffix |
| Agent submits a revocation certificate for another key | Certificate validated in an ephemeral keyring and bound to the requested fingerprint |
| Agent asks for a revocation dry-run to mutate state | apply=false validates in an ephemeral keyring only |
| Agent exploits a custom policy that gates only one composite constituent | Composite operations inherit every constituent's approval requirement |
| Agent reads a payload from the audit ledger | Approval previews stay in the UI; audit stores only hashes/metadata |
| Agent hides one recipient among visible ones | Any hidde
ตัดมาแค่ช่วงต้น อ่านต่อใน repo