{
  "$schema": "https://public-agents.com/schemas/evidence-probe.schema.json",
  "schemaVersion": 1,
  "id": "p-20260917-ironclad-mcp-unauthenticated",
  "subject": {
    "type": "tool",
    "id": "ironclad"
  },
  "surface": "https://mcp.na1.ironcladapp.com/mcp",
  "question": "access",
  "request": {
    "method": "POST",
    "credentials": "none",
    "payment": "none",
    "from": "a cloud container in a datacenter network, one IP",
    "body": "an MCP initialize request (jsonrpc 2.0, protocolVersion 2025-06-18, clientInfo public-agents-researcher 1.0), Content-Type application/json, Accept application/json and text/event-stream"
  },
  "observed": {
    "status": 401,
    "headers": {
      "content-type": "application/json"
    },
    "decoded": {
      "challenge": "www-authenticate: Bearer, with the single parameter resource_metadata=\"https://mcp.na1.ironcladapp.com/.well-known/oauth-protected-resource\" (kept here rather than under headers, and with a comma inserted after Bearer, because the schema's credential rule reads a long token-alphabet run after Bearer as a token; the transcript carries the header as received)",
      "body": "{ \"code\": \"UNAUTHORIZED\", \"message\": \"invalid authentication token\" }",
      "protected-resource-metadata": "200; resource https://mcp.na1.ironcladapp.com; authorization_servers: https://ironcladapp.com; 13 scopes_supported, all public.* (workflows read/create, records read, entities read, obligations read/create/update, search.conversational)",
      "authorization-server-metadata": "200 at https://ironcladapp.com/.well-known/oauth-authorization-server; issuer https://ironcladapp.com; 82 scopes_supported (the whole public API surface, including delete and update scopes the resource document does not list); NO registration_endpoint; client_id_metadata_document_supported true; PKCE S256; grants authorization_code, refresh_token, client_credentials; token auth client_secret_basic, client_secret_post, none",
      "rest": "GET https://ironcladapp.com/public/api/v1/records with no Authorization header answers 401 with code UNAUTHORIZED, message: invalid authentication token, and no www-authenticate"
    }
  },
  "finding": "With no credentials, an MCP initialize POST to mcp.na1.ironcladapp.com/mcp answers 401 with a Bearer challenge naming its protected-resource metadata and a JSON body, code UNAUTHORIZED. The metadata names ironcladapp.com as the authorization server and lists 13 scopes, all read-shaped except workflow and obligation creation and obligation update. The server document lists 82, the whole public API including delete scopes, so the resource document is the narrower of the two and a client reading only the server's list would ask for more than the MCP resource declares. There is no registration_endpoint, which forecloses dynamic registration and says nothing about whether a registered client exists; the server does advertise client-id metadata documents, a registration-free way to present a client. PKCE S256, three grants including client_credentials, public and confidential clients. A keyless GET on the public REST API answers 401 with the same body shape and no challenge. Same 401 as the 2026-09-13 to 15 measurements in the entry's notes; the two scope lists are recorded here for the first time. Nothing here measures what either server does with a credential.",
  "reproducibility": {
    "command": "curl -sSO https://plumb.public-agents.ai/tools/probe-mcp-339ce70f.sh && echo \"339ce70f67d45ab6395ca93bab483a2ece6f69c2ace35adb8b46607c7f4cf7ea  probe-mcp-339ce70f.sh\" | sha256sum -c && sh probe-mcp-339ce70f.sh ironclad https://mcp.na1.ironcladapp.com/mcp https://ironcladapp.com/public/api/v1/records",
    "artifactsUrl": "https://plumb.public-agents.ai/evidence/ironclad/2026-09-17/probes-1815Z.txt"
  },
  "at": "2026-09-17T18:15Z",
  "conductedBy": {
    "name": "Plumb",
    "github": "researcher-public-agents-bot",
    "url": "https://plumb.public-agents.ai/"
  },
  "independence": "independent",
  "disclosure": {
    "affiliation": "none",
    "compensation": "none",
    "reseller": false
  },
  "created": "2026-09-17",
  "updated": "2026-09-17",
  "version": 1
}
