Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Description from the maker (original English)
One API, all things verified — control, delegation, human approval, anti-impersonation.
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
PROOF_API_KEY, PROOF_BASE_URLValues marked secret are keys to your account. Never share them or paste them into a chat.
You need
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Works in Claude on the web, desktop and mobile:
https://api.proof.holdings/mcpOpen Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json
{
"mcpServers": {
"proof": {
"command": "npx",
"args": [
"-y",
"@proof-holdings/mcp-server"
],
"env": {
"PROOF_API_KEY": "your-value",
"PROOF_BASE_URL": "your-value"
}
}
}
}Run this in your terminal
claude mcp add --transport http proof https://api.proof.holdings/mcpclaude mcp add proof --env PROOF_API_KEY=your-value --env PROOF_BASE_URL=your-value -- npx -y @proof-holdings/mcp-serverFill in the empty values before running it.
Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json
{
"mcpServers": {
"proof": {
"url": "https://api.proof.holdings/mcp"
}
}
}Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json
{
"mcpServers": {
"proof": {
"command": "npx",
"args": [
"-y",
"@proof-holdings/mcp-server"
],
"env": {
"PROOF_API_KEY": "your-value",
"PROOF_BASE_URL": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Paste into .vscode/mcp.json in your project
{
"servers": {
"proof": {
"type": "http",
"url": "https://api.proof.holdings/mcp"
}
}
}Paste into .vscode/mcp.json in your project
{
"servers": {
"proof": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@proof-holdings/mcp-server"
],
"env": {
"PROOF_API_KEY": "your-value",
"PROOF_BASE_URL": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
ChatGPT connects only to servers on the internet:
https://api.proof.holdings/mcpMenu names can differ slightly by plan and over time.
Your choice stays on this device in a cookie; no account needed.
PROOF_BASE_URL envThese settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
We have not read this server’s tool list yet; we check endpoints in rotation.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 7, 2026
The registry name was verified against the domain proof.holdings (the registry checks domain ownership)
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
Responded in 924 ms (HTTP 200)
No sign-in needed
Not checked yet; we read the tool list when we check the endpoint
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 2 of 2 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
You need to fill in: PROOF_API_KEY
Either way works: install it on your computer or connect to the cloud version.
The GitHub repo last changed –, and the latest version (1.8.0) reached the registry 2 days ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. It connects by URL, so apps that accept remote MCP servers work too, such as ChatGPT in developer mode.
In the same category: Spec Driven Development, Remote Desktop Commander, 御府和田玉 在售作品查询
Servers in the same category from other makers, sorted by stars.
Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Live in-stock Hetian jade from Yufu, Shanghai: prices, monthly price guide, book a viewing.
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
MCP (Model Context Protocol) server for the proof.holdings API. Exposes 179 tools for AI agents to create verifications, validate proofs, manage assets, and more.
Hosted — nothing to install. The same tools are served over HTTP at https://api.proof.holdings/mcp. Any MCP client or agent framework with HTTP transport can connect — add the URL as a remote MCP server in its settings (the config key varies by client). Authentication happens in the browser the first time a tool needs an account. As a config fragment:
{ "mcpServers": { "proof": { "type": "http", "url": "https://api.proof.holdings/mcp" } } }
⚠️ Versions before `1.1.0` predate the delegation tools and the keyless public mode and expose an older, smaller surface than this README describes. If a client is pinned to 1.0.0, upgrade it or use the hosted server above. The current instructions are always at https://proof.holdings/md/docs/mcp.md.
Local — this package. Installs and runs as a stdio server:
npm install -g @proof-holdings/mcp-server
Or run directly with npx (no install needed):
npx @proof-holdings/mcp-server
| Variable | Required | Default | Description |
|---|---|---|---|
PROOF_API_KEY | No | — | API key (pk_live_... or pk_test_...). Without it the server still starts in public mode: the keyless tools (account bootstrap, login, proof and delegation verification) work, and every other tool answers api_key_required. |
PROOF_BASE_URL | No | https://api.proof.holdings | API base URL |
Get your API key from the proof.holdings dashboard, or let the server get one for you with login (below).
npx @proof-holdings/mcp-server login
--channel, or asked). The terminal shows the link and a QR code to scan with your phone, the text and number to send for SMS, or asks for the code from the email.~/.proof-holdings/credentials (readable by you only), under the API in PROOF_BASE_URL. The server uses it from its next start, so restart your MCP client's server.login says so; sign it out in the dashboard under Settings → Security → Signed-in devices.PROOF_API_KEY, when set, always wins over the saved key, and a key saved for one API (say, staging) is never sent to another. Then leave env out of the client config:
{ "mcpServers": { "proof-holdings": { "command": "npx", "args": ["-y", "@proof-holdings/mcp-server"] } } }
| Command | What it does |
|---|---|
login | Signs in, confirms, creates and saves a key. --test creates a test key (pk_test_); --scopes a,b limits it (default: full access); --email you@example.com logs in by email. |
status | Shows which key the server would start with and where it comes from. No network call. |
logout | Removes the saved key for this API from this computer. |
The key does not expire. Logging in again replaces the saved key but does not revoke the old one, and logout only forgets it locally: revoke keys you no longer use in the dashboard (API keys) or with the revoke_api_key tool. login needs an interactive terminal and an https:// API (plain http only for localhost).
Add the following to your MCP client config file:
{
"mcpServers": { "proof-holdings": { "command": "npx", "args": ["-y", "@proof-holdings/mcp-server"], "env": { "PROOF_API_KEY": "pk_live_your_key_here" } } } }
Config file location by client:
| Client | Config file |
|---|---|
| Claude Desktop (macOS) | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Claude Desktop (Windows) | %APPDATA%\Claude\claude_desktop_config.json |
| Cursor | .cursor/mcp.json in your project root |
| Claude Code | Run claude mcp add proof-holdings -- npx -y @proof-holdings/mcp-server |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
Keep the scoped npx -y @proof-holdings/mcp-server command even after a global install. A bare command name is looked up on PATH, or by npx in the npm registry, where it can belong to someone else's package.
Group totals are exact. The tables name the tools you are most likely to reach for rather than all of them — your MCP client's own tools/list is the complete, current list, and it is the one this server answers from.
| Tool | Description |
|---|---|
create_verification | Create a verification challenge |
get_verification | Get verification status |
submit_verification_code | Submit a verification code |
trigger_verification | Trigger a verification check |
wait_for_verification | Poll until it completes |
create_multi_channel_verification | One phone, up to three channels, first completion wins |
create_verification_request | Create a multi-asset request |
get_request_by_reference | Look a request up by reference id |
| Tool | Description |
|---|---|
add_domain | Add a domain to verify |
verify_domain | Check the challenge record and mint the proof |
connect_cloudflare | Connect Cloudflare so records are written for you |
verify_domain_with_credentials | Prove control using stored credentials |
setup_domain_email | Set up sending from the domain |
| Tool | Description |
|---|---|
get_platform_summary | One-call snapshot of the account |
get_usage | Quota and usage for the period |
get_balance | The prepaid balance and the auto top-up setting |
search | Search across the account |
create_account | Bootstrap a new account (no key needed) |
create_api_key | Create a scoped API key |
list_assets | List verified assets and their proof handles |
| Tool | Description |
|---|---|
create_hitl | Create a human-approval configuration |
create_confirmation | Send an approval request to a person |
wait_for_confirmation | Poll until a person approves or denies |
create_authorization | Ask a person to consent to being contacted |
revoke_authorization | Withdraw a consent |
| Tool | Description |
|---|---|
create_circle | Create a circle of trusted contacts |
add_circle_member | Add a contact |
invite_circle_member | Send a single-use enrollment link |
create_identity_challenge | Run a cross-channel identity check |
| Tool | Description |
|---|---|
create_profile | Create a public profile |
claim_username | Claim a public username |
update_public_proofs | Choose which proofs a profile shows |
| Tool | Description |
|---|---|
list_templates | List a sub-account's message templates |
render_template | Render a template with variables |
list_webhook_deliveries | List webhook deliveries |
retry_webhook_delivery | Retry a failed delivery |
Each endpoint has its own URL, events and signing secret, and serves either every sub-account or the ones you select. A signing secret is returned only on create and on rotate — store it then.
| Tool | Description |
|---|---|
list_webhook_endpoints | List the account's webhook endpoints |
get_webhook_endpoint | Get one endpoint (no secret) |
create_webhook_endpoint | Add an endpoint; returns its signing secret |
update_webhook_endpoint | Change URL, events, scope, sub-accounts or status |
delete_webhook_endpoint | Delete an endpoint |
rotate_webhook_endpoint_secret | Replace an endpoint's signing secret |
rotate_callback_secret | Replace a sub-account's callback signing secret |
| Tool | Description |
|---|---|
create_delegation | Authorize an artifact from a domain you have proven |
revoke_delegation | Revoke a delegation |
verify_delegation | Check whether an artifact is authorized by the domain it claims |
validate_proof | Verify a signed proof token (no key needed) |
get_proof_status | Read a proof's status by its public handle |
list_revoked_proofs | Read the revocation list (no key needed) |
get_proof_token | Fetch the current (re-signed) token of a proof you own (not one of your own verified assets: that is read in the dashboard) |
list_reissued_proofs | List your proofs re-signed since an instant, except those of your own verified assets |
get_delegation_token | Fetch an active delegation's current token by handle (no key needed) |
| Tool | Description |
|---|---|
start_login | Begin a sign-in (no key needed) |
wait_for_login | Poll until sign-in completes |
get_current_user | Who the current session belongs to |
render_auth_link | Render a sign-in link for the user to open |
Use a test-mode API key (pk_test_*) to interact with the API without creating real verifications. Test-mode keys are available in your dashboard.
Two transports ship in this package:
npx -y @proof-holdings/mcp-server starts) — the server communicates over stdin/stdout. One user per process; this is what a client launches locally.node dist/remote.js) — a remote server that many users connect to over the network by URL, with no install. A connection starts ANONYMOUS — the keyless surface (account bootstrap, login, proof and delegation verification) works with no credential at all — and a tool that needs an account answers 401 with a WWW-Authenticate challenge naming the authorization server, which is what a standards-compliant client follows to sign in. The 401 lands on the TOOL CALL and never on a bare initialize or tools/list FOR AN ANONYMOUS CONNECTION: measured against live clients, refusing an anonymous handshake reads to the user as a connection timeout rather than as an invitation to log in. Three shapes are refused at the handshake instead — a presented token that does not resolve (there the 401 is what makes a client refresh), a request whose credential does not match the session it names, and an opening batch that smuggles a keyed tool call alongside initialize. A signed-in client sends the API key it was granted in the Authorization header — the only place a credential is read, never a query parameter — and each connection gets its own server and HTTP client, so one user's key or session can never reach another. /mcp serves POST (every JSON-RPC message) and DELETE (ending a session); every other method — including the optional standalone GET event stream — answers 405 with Allow: POST, DELETE, whatever session or credential the request carries. Nothing on this server pushes notifications, so declining the stream costs a client nothing, and it is what lets a client on Node 26's built-in fetch work: over HTTP/2 to the edge, with that stream open, it never sent its next request. PORT (default 3100), MCP_MAX_SESSIONS (default 100), MCP_SESSION_TTL_MS (default 30 min, counted from the last POST the server ACCEPTED — one it answered below 400. A POST refused before any work happens does not postpone it, whether the refusal is ours (body over 4MB) or the transport's (unparseable or empty body, unsupported mcp-protocol-version, a second initialize), and neither does a refused methOnly the beginning is shown; read the rest in the repo