Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Bind Protocol MCP server for credential verification, policy authoring, and zero-knowledge proof generation.
Bind Protocol MCP server for credential verification, policy authoring, and zero-knowledge proof generation.
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
You have access to the Bind Protocol MCP server. This document teaches you how to use it.
Node.js >= 18 β Required to run the server (npx handles package installation automatically) Bind account β Required for API-backed tools. Create one at https://dashboard.bindprotocol.xyz Agent key (idbr_agent_...) β Required for API-backed tools. Regular API keys (idbr_) are not supported for MCP.
Bind uses agent keys for MCP authentication. Agent keys are scoped API keys that let org admins control exactly which tools are available, set daily rate limits, and get audit logs. Key typeFormatMCP supportedAgent keyidbr_agent_<keyId>_<secret>Yes β required for API-backed toolsRegular API keyidbr_<keyId>_<secret>No β rejected by MCP server To create an agent key: Sign in at https://dashboard.bindprotocol.xyz Navigate to Settings > Agent Keys Select which tool categories the key can access (e.g., credential verification only, or policy authoring + verification) Copy the key β it is shown only once
Add the server to your MCP client configuration. The exact file depends on your tool: ToolConfig fileClaude Code.mcp.json in your project root, or ~/.claude/claude_desktop_config.jsonClaude DesktopSettings > Developer > Edit ConfigCursor.cursor/mcp.json in your project rootWindsurfMCP settings Configuration JSON: { "mcpServers": { "bind": { "command": "npx", "args": ["@bind-protocol/mcp-server"], "env": { "BIND_API_KEY": "${BIND_API_KEY}" } } } } The BIND_API_KEY environment variable must be set in your shell to your agent key before launching your AI tool. Never hardcode the key directly in config files β always use environment variable references to avoid accidental credential leakage in shared configs or repositories. Environment variables: VariableRequiredDefaultDescriptionBIND_API_KEYFor API-backed toolsβAgent key (idbr_agent_...). Without this, only local tools are available.BIND_API_URLNohttps://api.bindprotocol.xyzBase URL for API callsBIND_RECEIPTS_PATHNo~/.bind/receiptsDirectory for receipt chain dataLOG_LEVELNoinfoLogging verbosity (debug, info, warn, error)
If you do not have bind tools available, prompt the user to complete the setup above. You can test connectivity by calling bind_whoami β if it returns org info, the agent key is authenticated. Without a BIND_API_KEY, only local tools (parse, verify, hash) are available.
The server runs locally via npx and communicates with your AI tool over stdio. It provides both local tools (always available) and API-backed tools (require an agent key). You just call the tool by name β routing is handled automatically. Tool typeAuthPurposeLocal toolsNoneParse, verify, and hash VC-JWTs on-deviceAPI-backed toolsAgent key via BIND_API_KEYPolicies, proofs, issuers, revocation, and more
This is critical for understanding the privacy model: Local tools (credential data NEVER leaves the machine): bind_parse_credential β Decodes the JWT entirely on your machine bind_verify_credential β Fetches the issuer's public JWKS from the Bind API (public keys only), then verifies the signature locally. The credential itself is never sent. bind_hash_credential β Computes a SHA-256 hash locally. Only the irreversible hash is used for revocation checks. API-backed tools (send requests to api.bindprotocol.xyz): bind_check_revocation β Sends only the credential hash (not the credential). The hash is not reversible. bind_resolve_issuer β Fetches public keys for an org. No credential data involved. bind_explain_policy, bind_list_policies, bind_list_circuits β Read-only public metadata. No credential data involved. bind_submit_prove_job β Sends circuit inputs to the Bind proving service. These are the raw values being proven (e.g., income amount, mileage count). bind_issue_credential β Requests the Bind API to sign and issue a VC-JWT from a completed proof. bind_create_policy, bind_validate_policy β Sends policy spec JSON to Bind for validation/storage. bind_share_proof β Shares a proof record with a verifier org via the Bind API. In short: Raw credentials are local-only. Hashes, policy specs, proof inputs, and metadata go to the API.
ToolWhat it doesbind_parse_credentialDecode a VC-JWT into header + payload + signature without verificationbind_verify_credentialFull verification: parse, fetch issuer JWKS, verify ES256 signature, check expiration. Does NOT check revocation.bind_hash_credentialSHA-256 hash a VC-JWT. Use the hash with bind_check_revocation.
Discovery & Inspection ToolWhat it doesbind_resolve_issuerFetch an org's public signing keys (JWKS) by org IDbind_explain_policyGet the public spec for a policy by policy IDbind_check_revocationCheck if a credential is revoked by its hash (hash only β not the credential)bind_list_policiesList available policies (supports limit/offset pagination)bind_list_circuitsList available ZK circuits Proof Generation & Credential Issuance ToolWhat it doesbind_submit_prove_jobSubmit a ZK proof generation job with circuit ID and inputsbind_get_prove_jobPoll a prove job's status by job IDbind_list_prove_jobsList prove jobs, optionally filtered by statusbind_issue_credentialIssue a verifiable credential from a completed prove jobbind_share_proofShare a completed proof with a verifier orgbind_list_shared_proofsList proofs shared with/by your org Policy Authoring ToolWhat it doesbind_whoamiGet authenticated org info, tier, policy limits, and agent key permissionsbind_validate_policyDry-run validation of a policy spec (catches errors before creation)bind_create_policyCreate a new verification policybind_generate_circuitTrigger ZK circuit compilation for a saved policybind_get_circuit_statusPoll circuit compilation job status
When to use: A user gives you a VC-JWT string (starts with eyJ...) and wants to know if it's valid. Steps: bind_parse_credential β Decode the JWT to inspect claims bind_verify_credential β Verify signature and expiration bind_hash_credential β Compute SHA-256 hash bind_check_revocation β Send the hash (not the credential) to check revocation Steps 1 and 2 can be combined (verify includes parsing), but parsing first lets you show the user what the credential contains before the full check. Steps 1β3 run locally; step 4 sends only the hash to the API. Important: bind_verify_credential does NOT check revocation. You must always follow up with hash + revocation check for a complete verification. parse β verify β hash β check_revocation
When to use: A user wants to know about an organization's keys or policies. bind_resolve_issuer(orgId) β Fetch their JWKS bind_list_policies or bind_explain_policy β Look up their policies
When to use: A user wants to define a new verification policy. Steps: bind_whoami β Check org name, tier, and limits. You need the org name for the namespace. Build the policy spec (see Policy Spec Reference below) bind_validate_policy β Dry-run to catch errors before creation Fix any validation errors and re-validate bind_create_policy β Save the policy bind_generate_circuit β Queue ZK circuit compilation bind_get_circuit_status β Poll until status is completed or failed Critical rules: metadata.namespace MUST start with your org's slugified name (from bind_whoami). The namespaces bind and system are reserved. The policy id MUST start with the namespace (e.g., acme.finance.creditCheck for namespace acme). ALWAYS validate before creating. Fix all errors first. String inputs MUST have an encoding block mapping values to numbers (ZK circuits only work with numbers).
When to use: A user wants to generate a ZK proof and get a verifiable credential. bind_list_policies or bind_explain_policy β Find the right policy/circuit bind_submit_prove_job(circuitId, inputs) β Submit the proof job bind_get_prove_job(jobId) β Poll until status is completed bind_issue_credential(proveJobId) β Issue the VC from the completed proof Optionally: bind_share_proof(proveJobId, verifierOrgId) β Share with a verifier
A policy is a JSON object with this structure. All fields shown are required unless marked optional. { "id": "<namespace>.<category>.<name>", "version": "0.1.0", "metadata": { "title": "Human-readable title", "description": "What this policy verifies", "category": "finance|mobility|identity|demo", "namespace": "your-org-name" }, "subject": { "type": "individual|organization|vehicle|device", "identifier": "wallet_address|did|vin|vehicleTokenId" }, "inputs": [ { "id": "input_name", "source": { "kind": "static|api", "api": "optional_api_name" }, "signal": "input_name", "valueType": "number|boolean|string", "unit": "USD|count|months", "time": { "mode": "point|range|relative", "lookback": "30d" }, "aggregation": { "op": "latest|sum|mean|count" }, "encoding": { "type": "enum", "values": { "label1": 1, "label2": 2 } } } ], "rules": [ { "id": "rule_name", "description": "Human-readable description", "assert": { /* expression β see below */ }, "severity": "fail|warn|info" } ], "evaluation": { "kind": "PASS_FAIL|SCORE", "scoreRange": { "min": 0, "max": 100 }, "baseline": 50, "contributions": [ { "ruleId": "rule_name", "points": 30, "whenPasses": true } ] }, "outputs": [ { "name": "output_name", "type": "boolean|enum|number", "derive": { "kind": "PASS_FAIL|SCORE|BAND|CONST", "from": "SCORE|input_id", "bands": [ { "label": "LOW", "minInclusive": 0, "maxExclusive": 40 }, { "label": "HIGH", "minInclusive": 40, "maxExclusive": 101 } ], "value": 42 }, "disclosed": true } ], "validity": { "ttl": "P30D" }, "disclosure": { "default": "SELECTIVE", "exposeClaims": ["output_name"] }, "proving": { "circuitId": "<namespace>.<name>.v<version>", "inputTypes": { "input_name": "u32" }, "outputType": "u8" } }
TypeShapeExampleref{ "type": "ref", "inputId": "<input_id>" }Reference an input valueconst{ "type": "const", "value": <number|boolean> }Literal number or boolean (never strings)cmp{ "type": "cmp", "cmp": ">=|<=|>|<|==|!=", "left": <expr>, "right": <expr> }Comparisonop{ "type": "op", "op": "+|-|*|/", "args": [<expr>, ...] }Arithmeticand{ "type": "and", "args": [<expr>, ...] }Logical ANDor{ "type": "or", "args": [<expr>, ...] }Logical ORnot{ "type": "not", "arg": <expr> }Logical NOT Field name gotchas: Use "inputId" in ref expressions, NOT "path" Use "cmp" for the comparison operator, NOT "operator" Use "args" for operand lists, NOT "children" Use "arg" (singular) for not, NOT "expr" const values must be numbers or booleans, never strings
PASS_FAIL: All severity: "fail" rules must pass. No scoring. SCORE: Starts at baseline, adds/subtracts points from rule contributions. { "kind": "SCORE", "scoreRange": { "min": 0, "max": 100 }, "baseline": 50, "contributions": [ { "ruleId": "has_high_income", "points": 25, "whenPasses": true }, { "ruleId": "has_delinquencies", "points": -20, "whenPasses": true } ] }
KindUse forRequired fieldsPASS_FAILBoolean pass/fail from evaluationNoneSCORERaw numeric scorefrom: "SCORE"BANDMap score to labeled bandsfrom: "SCORE", bands arrayCONSTFixed valuevalue
ZK circuits only work with numbers. When a policy uses string inputs (employer names, country codes, etc.), you MUST include an encoding block: { "id": "employer", "source": { "kind": "static" }, "signal": "employer", "valueType": "string", "encoding": { "type": "enum", "values": { "Acme Corp": 1, "Globex Inc": 2, "Initech": 3 } } }
The proving section maps inputs to Noir types for the ZK circuit: { "proving": { "circuitId": "acme.safe_driver.v0_1_0", "inputTypes": { "miles_driven": "u32", "hard_brake_pct": "u8", "is_commercial": "bool" }, "outputType": "u8" } } Available Noir types: u8, u16, u32, u64, i8, i16, i32, i64, bool, Field
Policy authoring is gated by organization tier. Always call bind_whoami first to check limits. TierCan Create PoliciesNotesBasicNoVerification onlyPremiumYesLimited inputs/rules/outputsScaleYesExpanded limits, can create extractorsEnterpriseYesUnlimitedVerifierNoCannot create proofs or policies
ErrorCauseFixNAMESPACE_MISMATCHPolicy namespace doesn't match your orgUse your org name from bind_whoami as the namespace prefixTIER_LIMIT_EXCEEDEDYour tier doesn't allow this operationCheck bind_whoami for limitsINVALID_EXPRESSIONMalformed rule assertionCheck expression field names (inputId, cmp, args, arg)MISSING_ENCODINGString input without encodingAdd encoding.type: "enum" with values mapCIRCUIT_COMPILATION_FAILEDCircuit couldn't compileCheck the error in bind_get_circuit_status, fix the policy, recreate, and regenerate
Here is a complete example of creating a credit score policy for org acme: { "id": "acme.finance.credit-check", "version": "0.1.0", "metadata": { "title": "Credit Eligibility Check", "description": "Evaluates creditworthiness based on income and debt ratio", "category": "finance", "namespace": "acme" }, "subject": { "type": "individual", "identifier": "wallet_address" }, "inputs": [ { "id": "annual_income", "source": { "kind": "static" }, "signal": "annual_income", "valueType": "number", "unit": "USD" }, { "id": "debt_ratio", "source": { "kind": "static" }, "signal": "debt_ratio", "valueType": "number", "unit": "percent" } ], "rules": [ { "id": "min_income", "description": "Annual income must be at least $30,000", "assert": { "type": "cmp", "cmp": ">=", "left": { "type": "ref", "inputId": "annual_income" }, "right": { "type": "const", "value": 30000 } }, "severity": "fail" }, { "id": "max_debt_ratio", "description": "Debt-to-income ratio must be under 40%", "assert": { "type": "cmp", "cmp": "<", "left": { "type": "ref", "inputId": "debt_ratio" }, "right": { "type": "const", "value": 40 } }, "severity": "fail" } ], "evaluation": { "kind": "PASS_FAIL" }, "outputs": [ { "name": "eligible", "type": "boolean", "derive": { "kind": "PASS_FAIL" }, "disclosed": true } ], "validity": { "ttl": "P30D" }, "disclosure": { "default": "SELECTIVE", "exposeClaims": ["eligible"] }, "proving": { "circuitId": "acme.credit_check.v0_1_0", "inputTypes": { "annual_income": "u32", "debt_ratio": "u8" }, "outputType": "u8" } } Agent workflow for this: bind_whoami β Confirm org is acme and tier allows policy creation bind_validate_policy(policy) β Dry-run validation bind_create_policy(policy) β Create the policy bind_generate_circuit("acme.finance.credit-check") β Compile the circuit bind_get_circuit_status(jobId) β Poll until complete
Code helpers, APIs, CLIs, browser automation, testing, and developer operations.
Largest current source with strong distribution and engagement signals.