MCP Server
Integrate Qwick Cert directly into your AI coding assistant. Sign executables, verify signatures, manage API keys, and troubleshoot issues — all through natural language.
What is MCP?
The Model Context Protocol (MCP) is an open standard created by Anthropic for connecting AI coding tools to external services. It lets your AI assistant call tools, read resources, and follow guided prompts from a locally running server — no copy-pasting commands or switching windows.
The Qwick Cert MCP server exposes 15 tools, 6 resources, and 5 guided prompts that let your AI assistant sign Windows executables, inspect PE files, manage billing and approvals, check signing policies, manage API keys and team members, troubleshoot configuration issues, and run security audits — all in natural language from your editor.
Supported clients
Any client that implements the MCP specification will work. The following have been tested:
Claude Code
CLI v1.0+
Claude Desktop
v1.2+
Cursor
v0.43+
Windsurf
v1.0+
VS Code + Copilot
MCP extension required
Any MCP client
STDIO transport
Quick start
Four steps to get code signing in your AI assistant:
1. Install
npm install -g @qwickcert/cli @qwickcert/mcp
2. Authenticate
qwick auth login
This opens a browser window for OAuth. The token is saved to ~/.qwick/config.json and shared between the CLI and MCP server automatically.
3. Configure your AI client
Add the MCP server to your client (see the Configuration section below for per-client instructions).
4. Use it
Open your AI assistant and ask it to sign a file. The MCP server handles the rest.
> Sign all the exe files in my dist/ folder The assistant will call qwickcert_sign_files with the matched file paths, compute digests locally, send them to the API, and embed the returned signatures — all without you touching a terminal.
Configuration
The JSON configuration format is the same across all clients. Only the config file location differs.
Claude Code (CLI)
No config file needed — run a single command:
claude mcp add qwickcert -- npx -y @qwickcert/mcp
Claude Desktop
Add to your config file:
| Windows | %APPDATA%/Claude/claude_desktop_config.json |
| macOS | ~/Library/Application Support/Claude/claude_desktop_config.json |
{
"mcpServers": {
"qwickcert": {
"command": "npx",
"args": ["-y", "@qwickcert/mcp"]
}
}
}Cursor
Add to one of these locations:
| Project | .cursor/mcp.json |
| Global | ~/.cursor/mcp.json |
Windsurf
Add to .windsurf/mcp.json in your project root.
Cursor and Windsurf use the same JSON format as Claude Desktop shown above.
Environment variables
| Variable | Description | Default |
|---|---|---|
| QWICK_API_URL | API base URL override | https://api.qwickcert.com |
To pass environment variables to the MCP server, add an env block to your config:
{
"mcpServers": {
"qwickcert": {
"command": "npx",
"args": ["-y", "@qwickcert/mcp"],
"env": {
"QWICK_API_URL": "https://staging.qwickcert.com"
}
}
}
}Authentication
The MCP server reads auth tokens stored by the Qwick Cert CLI at ~/.qwick/config.json. There is no separate authentication step — run qwick auth login once and both the CLI and MCP server share the same session.
JWT tokens are automatically refreshed when they near expiry. API keys (qwick_ak_*) are also supported and never expire unless a TTL is configured at creation time.
Tools reference
The server exposes 15 tools that your AI assistant can call. Tools marked read are safe and idempotent. write tools modify files or create resources.
qwickcert_sign_files
writeSign one or more PE files with Authenticode. Computes the SHA-256 digest locally, sends only the 32-byte hash to the Qwick Cert API, and embeds the returned PKCS#7 signature into each file.
| Parameter | Type | Required | Description |
|---|---|---|---|
| files | string[] | Yes | Absolute paths to PE files (.exe, .dll, .msi, .sys) |
| project | string | No | Project slug override (defaults to .qwickrc.json value) |
| organization | string | No | Org slug override (defaults to active org) |
| verify | boolean | No | Run signtool verify after signing |
| dry_run | boolean | No | Compute digests only, do not sign |
Calls qwickcert_sign_files with files matching C:/build/dist/*.exe. Returns per-file status, operation IDs, and timing.
qwickcert_verify_signature
readVerify Authenticode signatures on PE files using signtool. Returns the certificate chain, timestamp validity, and overall signature status.
| Parameter | Type | Required | Description |
|---|---|---|---|
| files | string[] | Yes | Absolute paths to PE files to verify |
Calls qwickcert_verify_signature. Returns: - Signature status: Valid - Signer: Acme Corp (issued by Microsoft ID Verified CS EOC CA 01) - Timestamp: 2026-03-04T10:32:00Z (valid)
qwickcert_check_status
readCheck the current authentication state, organization info, Azure provisioning status, billing plan tier, and local project configuration. Takes no parameters.
This tool takes no parameters.
Calls qwickcert_check_status. Returns: - Auth: Authenticated as dev@acme.com - Org: acme-corp (Pro plan, 3/5 seats used) - Azure: Provisioned, certificate profile "desktop-app" active - Project: .qwickrc.json found, project slug "my-app"
qwickcert_signing_history
readQuery recent signing operations for your organization. Supports filtering by status, date range, and project.
| Parameter | Type | Required | Description |
|---|---|---|---|
| status | enum | No | Filter by status: completed, failed, abandoned, or pending |
| limit | number | No | Max results to return (default 20, max 100) |
| project | string | No | Filter by project slug |
| since | string | No | ISO 8601 date — only show operations after this time |
Calls qwickcert_signing_history with since set to the start of the current week. Returns a table of operations with file names, statuses, signers, and timestamps.
qwickcert_session_status
readShow active concurrent signing sessions and the queue depth. Azure limits each organization to 2 concurrent sessions. Takes no parameters.
This tool takes no parameters.
Calls qwickcert_session_status. Returns: - Active sessions: 2/2 (at capacity) - Queue depth: 1 - Oldest session started 45s ago by ci-bot@acme.com
qwickcert_setup_project
writeCreate or update a .qwickrc.json project configuration file for signing. This stores the certificate profile, file patterns, and verification preferences so your team can run qwick sign with no arguments.
| Parameter | Type | Required | Description |
|---|---|---|---|
| project | string | Yes | Certificate profile slug (e.g. "desktop-app") |
| directory | string | No | Target directory for the config file (defaults to cwd) |
| organization | string | No | Org slug override |
| files | string[] | No | Glob patterns for files to sign (e.g. ["dist/**/*.exe"]) |
| verify | boolean | No | Enable auto-verification after signing |
Calls qwickcert_setup_project with project "desktop-app". Creates .qwickrc.json with the profile, detected file patterns, and verify enabled.
qwickcert_manage_apikey
writeCreate, list, or revoke API keys for CI/CD signing pipelines. Keys are scoped to specific permissions.
| Parameter | Type | Required | Description |
|---|---|---|---|
| action | enum | Yes | Action to perform: create, list, or revoke |
| name | string | No | Human-readable key name (required for create) |
| permissions | enum[] | No | Scoped permissions: sign, read_audit |
| expires_in_days | number | No | Auto-expire after N days (omit for no expiry) |
| key_id | string | No | Key ID to revoke (required for revoke) |
Calls qwickcert_manage_apikey with action "create", name "github-actions-release", and permissions ["sign"]. Returns the key (qwick_ak_...) — shown once, never retrievable again.
qwickcert_troubleshoot
readRun a full diagnostic check: authentication status, signtool availability, API connectivity, Azure provisioning, project configuration, and signing policy validation. Takes no parameters.
This tool takes no parameters.
Calls qwickcert_troubleshoot. Returns a categorized diagnostic report: - Auth: OK (token valid, expires in 47 min) - signtool: WARN (not found — needed for verify only, not signing) - API: OK (api.qwickcert.com reachable, 120ms latency) - Azure: OK (certificate profile active) - Project: ERROR (no .qwickrc.json found in current directory)
qwickcert_team_overview
readShow team members, their roles, invitation status, and seat limits for the current organization. Takes no parameters.
This tool takes no parameters.
Calls qwickcert_team_overview. Returns: - 3/5 seats used (Pro plan) - alice@acme.com — Admin (active) - bob@acme.com — Member (active) - carol@acme.com — Member (pending invite)
qwickcert_policy_check
readCheck signing policies for the current organization — IP allowlists, time-of-day windows, and file restrictions. Optionally test a specific IP address against the configured allowlists.
| Parameter | Type | Required | Description |
|---|---|---|---|
| ip_address | string | No | IP address to check against allowlists (e.g. "203.0.113.42") |
Calls qwickcert_policy_check with ip_address "203.0.113.42". Returns: - IP allowlist: PASS (203.0.113.42 matches CIDR 203.0.113.0/24) - Time window: PASS (current time within Mon-Fri 06:00-22:00 UTC) - File restrictions: 2 rules active (.exe and .dll only)
qwickcert_inspect_file
readInspect PE files without signing — shows architecture (x86/x64/ARM64), subsystem, whether the file is already signed, file hashes, and signing readiness.
| Parameter | Type | Required | Description |
|---|---|---|---|
| files | string[] | Yes | Absolute paths to PE files to inspect |
Calls qwickcert_inspect_file. Returns: - MyApp.exe: x64, PE32+, Windows GUI, NOT signed, ready to sign - Helper.dll: x64, PE32+, DLL, already signed (cert size: 4096 bytes)
qwickcert_billing_usage
readCheck billing plan, usage limits, and signing statistics. Shows plan tier, member and signing limits, 30-day volume, and average signing duration.
This tool takes no parameters.
Calls qwickcert_billing_usage. Returns: - Plan: Pro ($99/yr) - Members: 1/1 used - Signings (30 days): 142 / No platform cap - Avg duration: 2.3s - All-time total: 1,847 operations
qwickcert_approval_requests
writeList, approve, or reject pending signing approval requests. When policies require admin sign-off before signing, this tool lets you manage the queue.
| Parameter | Type | Required | Description |
|---|---|---|---|
| action | enum | Yes | Action: list, approve, or reject |
| request_id | string | No | Approval request ID (required for approve/reject) |
| note | string | No | Optional note or reason for the decision |
Calls qwickcert_approval_requests with action "list". Returns: - 2 pending requests - build/MyApp.exe — requested by dev@acme.com at 10:32 AM - build/Updater.exe — requested by dev@acme.com at 10:33 AM
qwickcert_setup_status
readCheck Azure Trusted Signing provisioning status in detail. Shows which setup steps are complete, pending, or failed, and can retry failed steps.
| Parameter | Type | Required | Description |
|---|---|---|---|
| retry_step | string | No | Step name to retry if failed (e.g. "identity_validation") |
Calls qwickcert_setup_status. Returns: - ✓ Organization Created - ✓ Billing Subscription (Plan: pro) - ✓ Azure Signing Account Imported - ⟳ Identity Validation — In Progress - ○ Certificate Profile Ready — Pending
qwickcert_org_manage
writeManage organization members — invite new members, remove existing ones, or update roles. Complements the read-only qwickcert_team_overview tool.
| Parameter | Type | Required | Description |
|---|---|---|---|
| action | enum | Yes | Action: invite, remove, or update_role |
string | No | Email address (required for invite) | |
| member_id | string | No | Member ID (required for remove/update_role) |
| role | enum | No | Role: owner, admin, or signer |
Calls qwickcert_org_manage with action "invite", email "alice@acme.com", role "signer". An invitation email has been sent. Alice can accept it to join your organization.
Resources
MCP resources provide read-only context that your AI assistant can reference at any time without an explicit tool call. Resources are loaded automatically when the assistant needs background context.
qwickcert://configReturns a markdown summary of the current authentication state (logged-in user, token expiry), organization details (name, slug, plan tier, seat usage), Azure provisioning status, and any local .qwickrc.json project configuration detected in the working directory.
qwickcert://policiesReturns a markdown summary of all active signing policies for the organization, including IP allowlist rules, time-of-day windows, file type restrictions, and per-project overrides. Useful for understanding why a signing operation was blocked.
qwickcert://docs/quick-startReturns the Qwick Cert quick-start guide as markdown. The assistant can reference this to walk you through initial setup, explain concepts like certificate profiles and signing sessions, or answer general platform questions without web access.
qwickcert://docs/error-codesComplete reference of all QWICK_* error codes with HTTP status, human-readable explanation, and specific remediation steps. Lets the assistant give precise fixes when API errors occur instead of generic advice.
qwickcert://docs/securityDocuments the digest proxy security model — what data crosses the network, how credentials are protected, certificate chain details, and compliance controls. Useful for security reviews and audit conversations.
qwickcert://activityLive feed of recent signing operations for the organization — shows who signed what, when, with what status. Highlights recent failures for quick triage.
Prompts
Guided multi-step workflows that your AI assistant can invoke. These act like slash commands — they inject a structured plan into the conversation so the assistant follows a proven sequence of tool calls.
/qwickcert-sign
End-to-end signing workflow:
- Discovers PE files in the working directory
- Checks authentication and session availability
- Signs all matched files
- Verifies each signature with signtool
- Summarizes results with operation IDs
/qwickcert-setup
Interactive project setup:
- Verifies authentication (prompts login if needed)
- Lists available certificate profiles for the org
- Creates or updates
.qwickrc.json - Optionally generates a CI/CD API key
- Runs a test signing operation to confirm everything works
/qwickcert-troubleshoot
Step-by-step diagnostics:
- Runs the full diagnostic check (auth, API, Azure, signtool)
- Checks active sessions and queue depth
- Reviews signing policies for blockers
- Pulls recent signing history to identify patterns
- Provides actionable recommendations for each issue found
/qwickcert-cicd
CI/CD integration wizard:
- Verifies authentication and plan supports API keys
- Creates a scoped API key for CI/CD
- Detects your CI platform (GitHub Actions, Azure DevOps, GitLab CI)
- Generates pipeline configuration with signing and verification steps
- Includes best practices (secrets, dry-run on PRs, key expiration)
/qwickcert-audit
Security audit workflow:
- Reviews team access — roles, stale invitations, overly broad permissions
- Checks signing policies — IP rules, time windows, approval requirements
- Analyzes signing activity — failures, off-hours usage, anomalies
- Audits API keys — missing expiration, unused keys, excess permissions
- Produces a severity-rated findings report with action items
Usage examples
These examples show what happens behind the scenes when you ask your AI assistant to perform common tasks.
Signing workflow
You
Sign all the executables in my dist folder and verify them
Assistant
I'll sign those files for you. Let me check your setup first. > Called qwickcert_check_status > Auth OK, org "acme-corp", project "desktop-app" > Called qwickcert_sign_files > files: ["C:/project/dist/MyApp.exe", "C:/project/dist/Updater.exe"] > verify: true Signed 2 files in 4.2s — both signatures verified. - MyApp.exe — operation op_a1b2c3 (completed) - Updater.exe — operation op_d4e5f6 (completed)
Troubleshooting workflow
You
My signing keeps failing. Can you figure out what's wrong?
Assistant
Let me run a full diagnostic. > Called qwickcert_troubleshoot > Auth: OK — token valid, 47 min remaining > signtool: WARN — not found (verify only, not needed for signing) > API: OK — 120ms latency > Azure: OK — certificate profile active > Project: ERROR — no .qwickrc.json found > Called qwickcert_signing_history > Last 5 operations: all failed with QWICK_POLICY_801 > Called qwickcert_policy_check > IP allowlist: FAIL — your IP 98.51.100.12 is not in the allowlist The issue is a policy violation. Your IP address is not in your organization's signing allowlist. Ask your admin to add 98.51.100.12, or use qwickcert_policy_check to verify after they update it.
CI setup workflow
You
Set up code signing for my GitHub Actions release pipeline
Assistant
I'll configure the project and create a CI key. > Called qwickcert_setup_project > project: "desktop-app", files: ["dist/**/*.exe"], verify: true > Created .qwickrc.json > Called qwickcert_manage_apikey > action: "create", name: "github-actions-release" > permissions: ["sign"] Done. Here's your setup: 1. .qwickrc.json created with the "desktop-app" profile 2. API key created: qwick_ak_live_abc123... (copy it now — shown once) 3. Add it as QWICK_API_KEY in your repo's GitHub Secrets 4. Use qwickcert/sign-action@v1 in your workflow
Security model
The MCP server signs files without exposing your binaries or credentials. Here is what that means for your security posture:
File contents never leave your machine
The MCP server runs locally. When signing, it reads PE files from disk, computes the Authenticode hash in-process, and only transmits the 32-byte SHA-256 digest to the Qwick Cert API. Your binaries, source code, and file system are never exposed.
Only 32 bytes are transmitted
The signing payload is a single SHA-256 hash (32 bytes). The Qwick Cert API forwards this digest to Azure Trusted Signing, which returns a PKCS#7 signature blob. The MCP server embeds that blob back into the PE file locally.
Azure credentials never touch your machine
The Azure service principal credentials stay on the Qwick Cert backend. Your machine never sees Azure client secrets, certificates, or tokens. This eliminates the risk of credential leakage from developer workstations.
Auth tokens stored with restricted permissions
The CLI stores authentication tokens at ~/.qwick/config.json with file permissions restricted to the current user (0600 on Unix). JWT tokens are short-lived and automatically refreshed. API keys can be scoped to specific permissions and projects.
Architecture
The MCP server runs as a local STDIO process alongside your AI client. It reads the same auth tokens stored by the Qwick Cert CLI, so there is no separate authentication flow.
┌──────────────────────────┐
│ AI Client │ Claude Code, Cursor, Windsurf, etc.
│ (your editor) │
└────────┬─────────────────┘
│ MCP Protocol (STDIO — local process, no network)
│
┌────────▼─────────────────┐
│ @qwickcert/mcp │ Reads ~/.qwick/config.json for auth
│ (local MCP server) │ Computes PE digests (SHA-256) locally
└────────┬─────────────────┘
│ HTTPS (Bearer token, 32-byte digest payload)
│
┌────────▼─────────────────┐
│ Qwick Cert API │ api.qwickcert.com
│ (Vercel) │ Validates auth, enforces policies
└────────┬─────────────────┘
│ Azure REST API (service principal, server-side only)
│
┌────────▼─────────────────┐
│ Azure Trusted Signing │ Signs digest, returns PKCS#7 blob
│ (Microsoft) │ + RFC 3161 timestamp
└──────────────────────────┘The PKCS#7 signature blob travels back up the chain and is embedded into the PE file by the local MCP server. At no point do file contents or Azure credentials leave your machine.
Troubleshooting
MCP server not connecting
Make sure Node.js 18+ is installed. Test the server manually by running npx @qwickcert/mcp in your terminal — it should start without errors and wait for STDIO input. If you see module resolution errors, clear the npm cache with npx --yes @qwickcert/mcp.
Tools not showing up in your AI client
Restart your AI client after modifying the MCP configuration file. Most clients only read MCP config at startup. In Cursor, use Cmd/Ctrl+Shift+P and search for “Reload MCP Servers”. In Claude Desktop, fully quit and reopen the app.
"Not authenticated" errors
Run qwick auth login in your terminal. The MCP server reads the same tokens at ~/.qwick/config.json. If you recently logged in and still see errors, your token may have expired — run qwick auth login again to force a fresh token.
Token refresh failures
If automatic token refresh fails repeatedly, the refresh token itself may have expired (after 30 days of inactivity). Run qwick auth login to re-authenticate from scratch. For CI environments, use API keys instead of JWT tokens — they do not require refresh.
Permission denied on signing
Your account may not have the sign permission in your organization. Check your role with qwickcert_team_overview — you need the Member or Admin role. Contact your org admin to update your permissions.
Policy violation errors
Signing policies can block operations based on IP address, time of day, or file type. Run qwickcert_policy_check to see which policies are active and test your IP against the allowlist. Common fix: ask your admin to add your IP or CIDR range.
Signing fails with session limit
Azure limits organizations to 2 concurrent signing sessions. Use qwickcert_session_status to check current usage. Sessions expire automatically after 10 minutes, or you can wait for the queue to drain. If sessions appear stuck, an admin can force-release them from the dashboard.
signtool not found
signtool is optional for signing
The MCP server does not need signtool to sign files — only a 32-byte hash is sent to the server. signtool is only required for the qwickcert_verify_signature tool. If you need verify, install the Windows SDK (the “Windows SDK Signing Tools” component is sufficient).
Package details
npm: @qwickcert/mcp
Source: github.com/qwickcert/qwickcert
Protocol: Model Context Protocol (STDIO transport)
Requires: Node.js 18+, @qwickcert/cli for authentication