Skip to main content

fipsign-mcp

PyPI License: MIT NIST FIPS 204

MCP server for FIPSign — post-quantum digital signing via ML-DSA-44/65/87 (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 project's ML-DSA public key (requires API 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 and fipsign_generate_key_pair work without an API key. fipsign_public_key requires an API key — it returns the public key for the project associated with that 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 }" (algorithm may be ML-DSA-44, ML-DSA-65, or ML-DSA-87 depending on the project)
  • "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

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.2.tar.gz (12.9 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.2-py3-none-any.whl (11.4 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: fipsign_mcp-0.1.2.tar.gz
  • Upload date:
  • Size: 12.9 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.2.tar.gz
Algorithm Hash digest
SHA256 3c683258f315c992e4924be9e3b66c908901d484a66dde099b53247bcb7131b0
MD5 9b717fbacb78ecb4a1f21fb2173041dc
BLAKE2b-256 cf7744a29caf76b0ff8acc1660d4b375804eee8a81ab41625f0a66451eb72417

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fipsign_mcp-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 11.4 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.2-py3-none-any.whl
Algorithm Hash digest
SHA256 e29cb1416d037fc388fc1d05c19e6505428a97faf84792630b11ea4b7c701835
MD5 499fb63c1315a429686599bb3e944a65
BLAKE2b-256 0e9cba9ac26cfc1a27ac34a353ac228cbf3c88e1073e5557c3480bbdbe2de2b5

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