MCP server for FIPSign — post-quantum signing via ML-DSA-65 (NIST FIPS 204)
Project description
fipsign-mcp
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
- Python 3.10 or later
- A FIPSign account and API key — create one free at app.fipsign.dev
- 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
- Dashboard: app.fipsign.dev
- API status: status.fipsign.dev
- JS SDK: npmjs.com/package/fipsign-sdk
- Python SDK: pypi.org/project/fipsign-sdk
- TypeScript MCP: npmjs.com/package/@fipsign/mcp
- NIST FIPS 204: csrc.nist.gov/pubs/fips/204/final
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1deb0b1cf045f42ab5196aa70a0ea639df85de9d3948e71149b87fa8c31207b6
|
|
| MD5 |
23b9dbf1f33e32c94986fcb5ec34593d
|
|
| BLAKE2b-256 |
bd1646767cb2f8e5fd8e34b40469698a51c88409182c21459ccd012706f7d8dc
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ef248f2e90731110abbd761083c0e40bfa04a66c5ceafc0966c0ff0b1a0455cc
|
|
| MD5 |
c62f04da0a4c6ded113fa2bb1460fbce
|
|
| BLAKE2b-256 |
a8c1739c18e5a459aac0c89f4d7d01218e2c8b94e8c732849e056f3d88775fe7
|