Skip to main content

MCP server for FIPSign — post-quantum signing via ML-DSA-65 (NIST FIPS 204)

Project description

fipsign-mcp

PyPI License: MIT NIST FIPS 204

MCP server for FIPSign — post-quantum digital signing via ML-DSA-65 (NIST FIPS 204).

Gives Claude Desktop, Claude Code, and any MCP-compatible AI agent full access to the FIPSign API without writing code: sign payloads, verify tokens, issue and revoke post-quantum certificates, and monitor usage.


Tools

Tool Description Token cost
fipsign_health Check service status free
fipsign_public_key Get the server's ML-DSA-65 public key free
fipsign_sign Sign any payload 1 token
fipsign_verify Verify a signed token 1 token
fipsign_revoke Permanently revoke a token 1 token
fipsign_usage Get token balance and usage history free
fipsign_generate_key_pair Generate an ML-DSA-65 key pair locally free
fipsign_ca_issue Issue a post-quantum certificate 1 token
fipsign_ca_revoke_cert Revoke a certificate 1 token
fipsign_ca_get_cert Get certificate status by ID free
fipsign_ca_get_crl Get the Certificate Revocation List free

Prerequisites

  1. Python 3.10 or later
  2. A FIPSign account and API key — create one free at app.fipsign.dev
  3. For CA tools: a CA created inside your project from the dashboard

Local testing before publishing

Level 1 — MCP Inspector (no Claude Desktop required)

The Inspector opens a browser UI where you can call each tool manually and inspect responses without Claude Desktop.

git clone https://github.com/fipsign/fipsign-mcp-python
cd fipsign-mcp-python
pip install -e .
export FIPSIGN_API_KEY=pqa_your_real_key
npx @modelcontextprotocol/inspector python -m fipsign_mcp.server

Open the URL shown in the terminal (typically http://localhost:5173). Select a tool, fill in the parameters, and run it.

Level 2 — Claude Desktop with local code (without publishing to PyPI)

Install in editable mode, then point Claude Desktop at the module:

pip install -e .

Add to your claude_desktop_config.json (see path below):

{
  "mcpServers": {
    "fipsign": {
      "command": "python",
      "args": ["-m", "fipsign_mcp.server"],
      "env": {
        "FIPSIGN_API_KEY": "pqa_your_real_key"
      }
    }
  }
}

Level 3 — Claude Desktop with published package (production)

{
  "mcpServers": {
    "fipsign": {
      "command": "uvx",
      "args": ["fipsign-mcp"],
      "env": {
        "FIPSIGN_API_KEY": "pqa_your_real_key"
      }
    }
  }
}

Or with pip-installed package:

{
  "mcpServers": {
    "fipsign": {
      "command": "fipsign-mcp",
      "env": {
        "FIPSIGN_API_KEY": "pqa_your_real_key"
      }
    }
  }
}

Installation for Claude Desktop

claude_desktop_config.json is located at:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json
  • Linux: ~/.config/Claude/claude_desktop_config.json

Add the fipsign entry inside mcpServers (create the file if it doesn't exist):

{
  "mcpServers": {
    "fipsign": {
      "command": "uvx",
      "args": ["fipsign-mcp"],
      "env": {
        "FIPSIGN_API_KEY": "pqa_your_real_key"
      }
    }
  }
}

Restart Claude Desktop after editing the config.


Installation for Claude Code

claude mcp add fipsign -- env FIPSIGN_API_KEY=pqa_your_real_key uvx fipsign-mcp

Or manually in your project's .claude/mcp.json:

{
  "mcpServers": {
    "fipsign": {
      "command": "uvx",
      "args": ["fipsign-mcp"],
      "env": {
        "FIPSIGN_API_KEY": "pqa_your_real_key"
      }
    }
  }
}

Environment variables

Variable Required Default Description
FIPSIGN_API_KEY Yes (for most tools) Your FIPSign API key. Format: pqa_ + 64 lowercase hex chars. Get one at app.fipsign.dev.
FIPSIGN_BASE_URL No https://api.fipsign.dev Override API base URL (useful for self-hosted instances or local dev).

fipsign_health, fipsign_public_key, and fipsign_generate_key_pair work without an API key.


Key pair generation — Python vs JS SDK note

fipsign_generate_key_pair returns the secretKey as the 32-byte ML-DSA-65 seed (base64), not the 4032-byte expanded key returned by the JS SDK's generateKeyPair(). The publicKey (1952 bytes) is identical in both SDKs and fully compatible with fipsign_ca_issue.

This difference only matters if you need to sign data locally on a Python device using the returned secretKey:

from cryptography.hazmat.primitives.asymmetric.mldsa import MLDSA65PrivateKey
import base64

private_key = MLDSA65PrivateKey.from_seed_bytes(base64.b64decode(secret_key))
signature   = private_key.sign(message)

Usage examples

Once configured, you can ask Claude:

Signing:

  • "Sign a token for user_123 with role admin that expires in 1 hour"
  • "Verify this token: { payload: '...', signature: '...', algorithm: 'ML-DSA-65', issuedAt: 123 }"
  • "Revoke this token because the user logged out"

Certificates:

  • "Generate a key pair for a new IoT device"
  • "Issue a certificate for device-serial-00123 using the public key I just generated, valid for 1 year"
  • "Check the revocation status of cert_abc123"
  • "Get the full CRL for our CA"
  • "Revoke certificate cert_abc123 — device was reported stolen"

Monitoring:

  • "How many tokens do I have left this month?"

Publishing to PyPI

pip install build twine
python -m build
twine upload dist/*

Links

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fipsign_mcp-0.1.1.tar.gz (12.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fipsign_mcp-0.1.1-py3-none-any.whl (11.3 kB view details)

Uploaded Python 3

File details

Details for the file fipsign_mcp-0.1.1.tar.gz.

File metadata

  • Download URL: fipsign_mcp-0.1.1.tar.gz
  • Upload date:
  • Size: 12.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.1

File hashes

Hashes for fipsign_mcp-0.1.1.tar.gz
Algorithm Hash digest
SHA256 1deb0b1cf045f42ab5196aa70a0ea639df85de9d3948e71149b87fa8c31207b6
MD5 23b9dbf1f33e32c94986fcb5ec34593d
BLAKE2b-256 bd1646767cb2f8e5fd8e34b40469698a51c88409182c21459ccd012706f7d8dc

See more details on using hashes here.

File details

Details for the file fipsign_mcp-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: fipsign_mcp-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 11.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.1

File hashes

Hashes for fipsign_mcp-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 ef248f2e90731110abbd761083c0e40bfa04a66c5ceafc0966c0ff0b1a0455cc
MD5 c62f04da0a4c6ded113fa2bb1460fbce
BLAKE2b-256 a8c1739c18e5a459aac0c89f4d7d01218e2c8b94e8c732849e056f3d88775fe7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page