{
  "authority_boundary": {
    "guarantees": [
      "Every finding, severity, control status, and assessment is produced by the deterministic engine and passed through verbatim.",
      "No language model participates in determining any of those values.",
      "Evidence content is data. Instruction-shaped text inside a package can never alter a control status, finding, severity, assessment, or report eligibility — the engine is deterministic and is never shown a prompt.",
      "The limit of that guarantee, stated plainly: evidence-derived fields are interpolated into the report narrative, so planted text still reaches a reading agent's context. Artifacts are labelled untrusted for this reason. The guarantee covers values, not reach.",
      "A control that did not run is reported as not run.",
      "When evidence is transcribed from documents, the model fills transcription fields only, every value carries a confidence and a source, low-confidence values are dropped rather than sent, and approved banking is never taken from the submitted documents."
    ],
    "never_exposed": [
      "approve or decline funding",
      "release, schedule, or transmit a payment",
      "issue a waiver or exception approval",
      "create or alter banking instructions",
      "override a finding, a severity, or a control status",
      "declare a package free of fraud",
      "record a human disposition or attestation"
    ],
    "scope_boundary": "The engine endpoint accepts pre-extracted structured evidence only and refuses a documents key with model_extraction_not_available. This MCP server may transcribe documents into that evidence with a language model before calling the engine; the transcription is untrusted and returned alongside the engine's verdict, never in place of it.",
    "statement": "This server prepares a human decision. It does not make one, and it cannot be configured to."
  },
  "document_limits": {
    "max_documents": 10,
    "max_pages": 100,
    "max_total_bytes": 26214400,
    "media_types": [
      "application/pdf",
      "image/png",
      "image/jpeg",
      "text/plain"
    ]
  },
  "engine_limits": {
    "max_approved_banking_records": 75,
    "max_body_bytes": 262144,
    "max_json_depth": 32,
    "max_json_nodes": 10000,
    "max_lines": 100,
    "max_response_bytes": 1048576,
    "max_string_bytes": 4096,
    "max_supporting_invoices": 75
  },
  "server": "plumbline",
  "synthetic_packages": [
    "clean",
    "missing_document",
    "material_exception",
    "prompt_injection"
  ],
  "tool_names": [
    "explain_verification_run",
    "get_evidence_requirements",
    "get_review_artifact",
    "get_verification_capabilities",
    "get_verification_run",
    "verify_funding_package"
  ],
  "tools": [
    {
      "description": "A non-authoritative, plain-language narrative of a run's control trace for an analyst or an executive. Presentation only: a status table copied verbatim from the engine heads every explanation, the narrative is checked against the trace's own vocabulary, and submitter-supplied text is never shown to the model. The trace from get_verification_run remains the record.",
      "example": {
        "audience": "analyst",
        "run_id": "run_…"
      },
      "input_schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "audience": {
            "description": "analyst (default): control by control. executive: outcome and reason, short.",
            "type": "string"
          },
          "run_id": {
            "description": "A run_id returned by verify_funding_package.",
            "type": "string"
          }
        },
        "required": [
          "run_id"
        ],
        "type": "object"
      },
      "name": "explain_verification_run",
      "title": "Explain a run in plain language"
    },
    {
      "description": "The structured evidence a funding package must carry, the cardinality limits enforced by the endpoint, which controls become unreachable when an input is missing, and what the endpoint refuses outright.",
      "example": {},
      "input_schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {},
        "type": "object"
      },
      "name": "get_evidence_requirements",
      "title": "Get evidence requirements"
    },
    {
      "description": "The artifact the engine produced: a Funding Upload Review Summary, an Incomplete Documentation Notice, or a withheld-report refusal with its deficiencies. Never synthesizes an artifact the engine declined to issue.",
      "example": {
        "run_id": "run_…"
      },
      "input_schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "run_id": {
            "description": "A run_id returned by verify_funding_package.",
            "type": "string"
          }
        },
        "required": [
          "run_id"
        ],
        "type": "object"
      },
      "name": "get_review_artifact",
      "title": "Get the review artifact for a run"
    },
    {
      "description": "What this Plumbline instance can and cannot do right now, read from the live health endpoint. Capabilities are release gates, so a capability reported as unavailable is genuinely unavailable. Also returns the authority boundary and the synthetic package catalog.",
      "example": {},
      "input_schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "properties": {},
        "type": "object"
      },
      "name": "get_verification_capabilities",
      "title": "Get verification capabilities"
    },
    {
      "description": "The full IVP-001 control trace: every control in mandatory order with its execution status (performed, not_performed, not_reached), the reason it did not run where applicable, coverage, and findings. A control that did not run is reported as one.",
      "example": {
        "run_id": "run_…"
      },
      "input_schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "run_id": {
            "description": "A run_id returned by verify_funding_package.",
            "type": "string"
          }
        },
        "required": [
          "run_id"
        ],
        "type": "object"
      },
      "name": "get_verification_run",
      "title": "Get the control trace for a run"
    },
    {
      "description": "Run IVP-001 against a funding package. Supply exactly one of: package_id for a synthetic demo package; evidence for a structured funding_request_evidence_v1 object; or documents (PDF, PNG, JPEG, text) and/or raw_text, which a language model transcribes into evidence first. Executes the real deterministic engine. Returns a run_id plus the engine's own verdict, and for documents the extracted evidence labelled untrusted with a confidence and source per field. This tool does not decide anything and cannot approve funding.",
      "example": {
        "package_id": "clean"
      },
      "input_schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "approved_banking": {
            "description": "The funder's approved banking on file, with documents only. Never taken from the documents themselves.",
            "items": {
              "additionalProperties": {},
              "type": "object"
            },
            "type": "array"
          },
          "documents": {
            "description": "Up to 10 documents, 25 MB and 100 pages in total. Not stored.",
            "items": {
              "additionalProperties": false,
              "properties": {
                "data": {
                  "description": "Base64 file bytes.",
                  "type": "string"
                },
                "media_type": {
                  "description": "application/pdf, image/png, image/jpeg, or text/plain.",
                  "type": "string"
                },
                "name": {
                  "description": "Distinct name; extracted values cite it.",
                  "maxLength": 200,
                  "minLength": 1,
                  "type": "string"
                },
                "role": {
                  "description": "Declared role. A declared supporting_invoice that yields nothing is recorded unreadable.",
                  "type": "string"
                }
              },
              "required": [
                "name",
                "media_type",
                "data"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "evidence": {
            "additionalProperties": {},
            "description": "A funding_request_evidence_v1 object. Must not contain a documents key; pass documents in the documents argument instead.",
            "type": "object"
          },
          "package_id": {
            "description": "One of the synthetic packages: clean, missing_document, material_exception, prompt_injection",
            "type": "string"
          },
          "raw_text": {
            "description": "Pasted document text, transcribed the same way as documents.",
            "maxLength": 200000,
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "verify_funding_package",
      "title": "Verify a funding package"
    }
  ],
  "transport": {
    "http": "POST /mcp (stateless Streamable HTTP; OAuth sign-in with Google through Clerk, bearer token on every request)",
    "stdio": "node src/server.js"
  },
  "version": "0.1.0"
}
