{
  "issuer": "https://sswcboken.se",
  "publisher": "Drömmarna från Tjärö / Studio Jardenberg",
  "contact": "joakim@jardenberg.com",
  "spec": "org.jardenberg/verifiable-mcp",
  "alg": "EdDSA",
  "kid": "ln2Y6OsJnhuUnXiHeKOiLTCKIlJOpk9PwDA3EVpYZp4",
  "previous_kids": [
    "ln2Y6OsJnhuUnXiH"
  ],
  "kid_migration": "Samma nyckel som tidigare — inget nyckelbyte, inga omsignerade svar. Endast kid-formatet har migrerat till RFC 7638 JWK thumbprint (base64url SHA-256 över {crv,kty,x}). Nya svar bär thumbprint-kid; det gamla kortade kid:t 'ln2Y6OsJnhuUnXiH' är en LEGACY-ETIKETT för SAMMA nyckel — en trunkering av den nuvarande thumbprinten, inte en pensionerad separat nyckel. Den listas i JWKS enbart så att signaturer från tiden före v0.2 fortsätter resolva; rotationsimplementationer ska INTE behandla den som ett nyckelbyte.",
  "canonicalization": "RFC 8785 (JCS)",
  "signature_format": "JWS compact (RFC 7515), detached-payload=false, header {alg:\"EdDSA\", kid, typ:\"verifiable-mcp+jws\"}, signed over the RFC 8785 canonical wrapper { iat, payload, payload_digest, content_digest, provenance }.",
  "signed": {
    "scope": "wrapper",
    "wrapper_shape": "{ iat: <unix seconds>, payload: <result data>, payload_digest: \"sha256:<hex over RFC 8785 canonical payload>\", content_digest: \"sha256:<hex over the exact bytes of the text arm as served>\", provenance: {...} }",
    "envelope": "result._meta[\"org.jardenberg/verifiable-mcp\"] = { spec, spec_version, alg, kid, signed, jws } on tools/call and resources/read; error.data[\"org.jardenberg/verifiable-mcp\"] on JSON-RPC errors. Both digests live inside the signed wrapper; anything mirrored outside the JWS is convenience-only.",
    "applies_to": [
      "tools/call",
      "resources/read",
      "JSON-RPC error responses"
    ],
    "content_binding": "By digest: hash the exact bytes of the text arm as served and compare with content_digest inside the signed wrapper.",
    "error_payload_shape": "{ id: <request id>, error: { code, message, data? } }; error wrappers omit content_digest (no text arm is served for errors) and carry iat + payload + payload_digest + provenance. Invalid arguments use JSON-RPC code -32602.",
    "server_card_path_note": "The /.well-known/mcp.json server-card path follows SEP-2127, which is not yet frozen upstream — the path may change. Both the card and this dedicated key file are served.",
    "deprecated_v0_1": "The v0.1 `signature` + `provenance` sibling fields are dual-emitted during transition; removed in v0.3.",
    "structured_content": "structuredContent is byte-identical to wrapper.payload; deprecated v0.1 provenance/signature are top-level siblings of result.",
    "provenance_fields": [
      "server_operator",
      "publisher",
      "canonical_origin",
      "canonical_url",
      "dataset_version",
      "last_updated",
      "rights"
    ]
  },
  "jwks": {
    "keys": [
      {
        "kty": "OKP",
        "crv": "Ed25519",
        "x": "_XTbAAUHZSw9umaO-adqh11fn2hkts8EKOQ9-eFAiyA",
        "kid": "ln2Y6OsJnhuUnXiHeKOiLTCKIlJOpk9PwDA3EVpYZp4",
        "alg": "EdDSA",
        "use": "sig"
      },
      {
        "kty": "OKP",
        "crv": "Ed25519",
        "x": "_XTbAAUHZSw9umaO-adqh11fn2hkts8EKOQ9-eFAiyA",
        "kid": "ln2Y6OsJnhuUnXiH",
        "alg": "EdDSA",
        "use": "sig"
      }
    ]
  },
  "rights": "per author; not Creative Commons",
  "endpoint": "https://sswcboken.se/api/mcp",
  "server_card": "https://sswcboken.se/.well-known/mcp.json",
  "spec_version": "0.2.1",
  "previous_kids_note": "'ln2Y6OsJnhuUnXiH' is a truncated alias of the current RFC 7638 thumbprint kid — same key, no re-signing. It genuinely circulated, so it stays listed during the transition."
}