Tools and REST calls
| MCP tool | REST | Purpose |
|---|
get_status | GET /cases/{case} | state of the case and next steps |
prove_domain | POST /cases/{case}/domain-proof | have the domain proof checked |
submit_self_assessment | POST /cases/{case}/self-assessment | send the self-assessment |
add_evidence | POST /cases/{case}/evidence | evidence: address or file |
set_test_target | POST /cases/{case}/test-target | name the release to test |
request_test | POST /cases/{case}/test-runs | request a lab test |
list_findings | GET /cases/{case}/findings | read the findings |
answer_finding | POST /cases/{case}/findings/{id}/answer | answer a finding |
get_case_log | GET /cases/{case}/log | signed case log |
get_report_draft | GET /cases/{case}/report-draft | draft report |
get_seal | GET /cases/{case}/seal | seal and HTML code after the award |
notify_release | POST /cases/{case}/releases | announce a new version |
get_criteria | GET /criteria | criteria catalogue with SHA-256 (no token) |
withdraw | POST /cases/{case}/withdraw | withdraw the application |
MCP server: https://nocip.com/mcp/ · REST: https://nocip.com/api/v1/ · OpenAPI · for language models: llms.txt
Verify the case log yourself
Every entry has the fields seq, time, case, step, action, actor, inputs, data, prev, hash and sig. hash is “sha256:” and the SHA-256 of the entry without hash and sig, as JSON with sorted keys, no spaces, UTF-8. prev is the hash of the entry before (null for the first). sig.ed25519 is the Ed25519 signature of the text of hash with the public key of NOCIP.
import base64, hashlib, json
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey
key = Ed25519PublicKey.from_public_bytes(base64.b64decode(PUBLIC_KEY_B64))
prev = None
for i, ev in enumerate(events, 1):
body ={k: v for k, v in ev.items() if k not in ('hash', 'sig')}
raw = json.dumps(body, sort_keys=True, separators=(',', ':'), ensure_ascii=False).encode()
assert ev['seq'] == i and ev['prev'] == prev
assert ev['hash'] == 'sha256:' + hashlib.sha256(raw).hexdigest()
key.verify(base64.b64decode(ev['sig']['ed25519']), ev['hash'].encode())
prev = ev['hash']