{
  "schema": "munipro.mcp.tool-profile.v1",
  "name": "banker",
  "profile_version": 1,
  "profile_schema_sha256": "f433219f09b3a5cef345879186a4c31caf7ae8d19ba894e16b4c149f8619db1b",
  "tool_count_ceiling": 11,
  "dataset_schema_version": "1.1",
  "datasets": [
    "annualChart",
    "annualPI",
    "annualProfile",
    "annualTree",
    "continuousChart",
    "continuousPI",
    "continuousProfile",
    "continuousTree",
    "groupedRollup",
    "journalEntries",
    "monthlyChart",
    "outstanding",
    "semiannualChart",
    "semiannualPI",
    "semiannualProfile",
    "semiannualTree",
    "tree",
    "upcomingPayments"
  ],
  "dataset_option_keys": [
    "allBorrowerSecurities",
    "amort",
    "asOfDate",
    "cusips",
    "debtServiceMode",
    "encoding",
    "fiscalYearEnd",
    "frequency",
    "includeAllocations",
    "includeAsOfCashflow",
    "includeMatured",
    "includeMaturedCashflows",
    "includePayingAgent",
    "includePools",
    "includeVariableDebt",
    "leafCredit",
    "leafSeries",
    "lens",
    "netDsAsOfDate",
    "netDsScenario",
    "paymentsEndDate",
    "paymentsStartDate",
    "securityIds",
    "securityKeys",
    "sparseRollup",
    "treeEncoding",
    "treeGroup",
    "variableRate",
    "viewMode"
  ],
  "tools": [
    {
      "access": {
        "approval_class": "compute",
        "area_ids": [
          "financing_bond_math"
        ],
        "min_tier": "pro",
        "operation_effect": "background_job_cancel",
        "quota_tier": "read",
        "ref_prefixes": [],
        "required_scopes": [
          "debt.write",
          "model.run",
          "debt.read"
        ],
        "requires_confirmation": false,
        "requires_owner_user": false,
        "requires_staff_owner": false,
        "scope_policy": "async_job_type_dependent"
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Destructive immediate control: after explicit user request, cancel an exact owned queued mcp-job:// ref; running/done/failed return normalized 409 and are never force-terminated.",
      "inputSchema": {
        "properties": {
          "job_ref": {
            "type": "string"
          }
        },
        "required": [
          "job_ref"
        ],
        "type": "object"
      },
      "name": "cancel_job",
      "outputSchema": {
        "properties": {
          "result": {
            "additionalProperties": true,
            "type": "object"
          }
        },
        "required": [
          "result"
        ],
        "type": "object"
      },
      "title": "Cancel Job"
    },
    {
      "access": {
        "approval_class": "read",
        "area_ids": [
          "borrowers"
        ],
        "min_tier": "free",
        "operation_effect": "read",
        "quota_tier": "read",
        "ref_prefixes": [],
        "required_scopes": [],
        "requires_confirmation": false,
        "requires_owner_user": false,
        "requires_staff_owner": false,
        "scope_policy": "ref_dependent"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Fetch an entitled issuer, borrower, debt, security, trade, holder, cashflow, EMMA, or mcp-job-result page ref. Durable result pages carry ordered structural operations, global next/previous refs, independently signaled provenance/notice companion refs, RFC 8785 SHA-256 provenance, a manifest-bound professional-use notice, submit-time and current live authorization checks, and the same 48-hour expiry as their parent job. Read-only: a debt-export, debt-report, budget-export, investment-export or investor-document text ref is refused with the tool to call instead (export_debt_details, build_debt_report, the two workbook exports or get_investor_document_text), because those create a file or start work. The first fetch of a dataset job's data pages only indexes that job's stored file into pages; it adds no data and expires with the job.",
      "inputSchema": {
        "properties": {
          "id": {
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "fetch",
      "outputSchema": {
        "properties": {
          "result": {
            "additionalProperties": true,
            "type": "object"
          },
          "status": {
            "description": "Normalized outcome of this read-tool invocation.",
            "enum": [
              "ok",
              "validation_error",
              "constraint_unsatisfied",
              "authentication_error",
              "access_denied",
              "not_found",
              "conflict",
              "rate_limited",
              "client_error",
              "internal_error",
              "unavailable"
            ],
            "type": "string"
          },
          "status_code": {
            "description": "HTTP-style outcome code for this read-tool invocation.",
            "maximum": 599,
            "minimum": 100,
            "type": "integer"
          }
        },
        "required": [
          "result",
          "status",
          "status_code"
        ],
        "type": "object"
      },
      "title": "Fetch"
    },
    {
      "access": {
        "approval_class": "read",
        "area_ids": [],
        "min_tier": "free",
        "operation_effect": "read",
        "quota_tier": "read",
        "ref_prefixes": [],
        "required_scopes": [],
        "requires_confirmation": false,
        "requires_owner_user": false,
        "requires_staff_owner": false,
        "scope_policy": "metadata_only"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Show session, scopes, owner binding, and model-sized workflow summaries; detail may be summary or full.",
      "inputSchema": {
        "properties": {
          "detail": {
            "default": "summary",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "get_current_munipro_context",
      "outputSchema": {
        "properties": {
          "result": {
            "additionalProperties": true,
            "type": "object"
          },
          "status": {
            "description": "Normalized outcome of this read-tool invocation.",
            "enum": [
              "ok",
              "validation_error",
              "constraint_unsatisfied",
              "authentication_error",
              "access_denied",
              "not_found",
              "conflict",
              "rate_limited",
              "client_error",
              "internal_error",
              "unavailable"
            ],
            "type": "string"
          },
          "status_code": {
            "description": "HTTP-style outcome code for this read-tool invocation.",
            "maximum": 599,
            "minimum": 100,
            "type": "integer"
          }
        },
        "required": [
          "result",
          "status",
          "status_code"
        ],
        "type": "object"
      },
      "title": "Get Current MuniPro Context"
    },
    {
      "access": {
        "approval_class": "compute",
        "area_ids": [
          "debt_details"
        ],
        "min_tier": "pro",
        "operation_effect": "background_job_submit",
        "quota_tier": "read",
        "ref_prefixes": [],
        "required_scopes": [
          "debt.read"
        ],
        "requires_confirmation": false,
        "requires_owner_user": true,
        "requires_staff_owner": false,
        "scope_policy": ""
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Queue JSON for the same datasets that construct debtDetails tables and charts. Defaults: outstanding and groupedRollup. Dense detail requires <=250 explicitly selected securities on large issuers; requests refuse rather than truncate. Poll get_job_status, then GET api_download.url with the current MCP bearer to download full JSON. Schema and transformation guide: /static/mcp/banker-data-guide.md.",
      "inputSchema": {
        "properties": {
          "datasets": {
            "items": {
              "enum": [
                "outstanding",
                "groupedRollup",
                "tree",
                "annualChart",
                "semiannualChart",
                "monthlyChart",
                "continuousChart",
                "annualTree",
                "semiannualTree",
                "continuousTree",
                "annualProfile",
                "semiannualProfile",
                "continuousProfile",
                "annualPI",
                "semiannualPI",
                "continuousPI",
                "upcomingPayments",
                "journalEntries"
              ],
              "type": "string"
            },
            "minItems": 1,
            "type": [
              "array",
              "null"
            ]
          },
          "issuer_id": {
            "type": "string"
          },
          "options": {
            "additionalProperties": false,
            "description": "Dates are YYYY-MM-DD or MM/DD/YYYY. Use cusips or securityIds/securityKeys, not both. leafCredit/leafSeries keep outstanding rows with that credit/series name; null, false, 0, [], {} or blank is no filter, and with outstanding the server refuses other non-text values. Requests without outstanding ignore them. The server refuses NUL, a lone surrogate or a value no job result can return.",
            "properties": {
              "allBorrowerSecurities": {
                "description": "Default true without selectors. Refused: true with them; false without them unless datasets is only outstanding.",
                "type": "boolean"
              },
              "amort": {
                "enum": [
                  "expected",
                  "worstcase"
                ],
                "type": "string"
              },
              "asOfDate": {
                "description": "Default today.",
                "type": [
                  "string",
                  "null"
                ]
              },
              "cusips": {
                "items": {
                  "minLength": 1,
                  "type": "string"
                },
                "type": "array"
              },
              "debtServiceMode": {
                "enum": [
                  "gross",
                  "net"
                ],
                "type": "string"
              },
              "encoding": {
                "enum": [
                  "columnar",
                  "dense"
                ],
                "type": "string"
              },
              "fiscalYearEnd": {
                "default": "12/31",
                "description": "MM/DD, e.g. 06/30. The server applies the exact date rule.",
                "pattern": "^(?!02/3|(0[469]|11)/31)(0[1-9]|1[0-2])/([ 0][1-9]|3[01]|[12][^/]+)$(?!\\n)",
                "type": "string"
              },
              "frequency": {
                "enum": [
                  "monthly",
                  "semiannual",
                  "annual"
                ],
                "type": "string"
              },
              "includeAllocations": {
                "type": "boolean"
              },
              "includeAsOfCashflow": {
                "type": "boolean"
              },
              "includeMatured": {
                "type": "boolean"
              },
              "includeMaturedCashflows": {
                "type": "boolean"
              },
              "includePayingAgent": {
                "type": "boolean"
              },
              "includePools": {
                "type": "boolean"
              },
              "includeVariableDebt": {
                "type": "boolean"
              },
              "leafCredit": {
                "pattern": "^[^\\x00]*$"
              },
              "leafSeries": {
                "pattern": "^[^\\x00]*$"
              },
              "lens": {
                "enum": [
                  "security",
                  "project"
                ],
                "type": "string"
              },
              "netDsAsOfDate": {
                "pattern": "^[^\\x00]*$"
              },
              "netDsScenario": {
                "pattern": "^[^\\x00]*$"
              },
              "paymentsEndDate": {
                "description": "Null opens this end.",
                "pattern": "^[^\\x00]*$"
              },
              "paymentsStartDate": {
                "description": "Null opens this end.",
                "pattern": "^[^\\x00]*$"
              },
              "securityIds": {
                "items": {
                  "minimum": 1,
                  "type": "integer"
                },
                "type": "array"
              },
              "securityKeys": {
                "items": {
                  "minLength": 1,
                  "type": "string"
                },
                "type": "array"
              },
              "sparseRollup": {
                "type": "boolean"
              },
              "treeEncoding": {
                "enum": [
                  "wide",
                  "columnar"
                ],
                "type": "string"
              },
              "treeGroup": {
                "enum": [
                  "series",
                  "fund"
                ],
                "type": "string"
              },
              "variableRate": {
                "default": 1.0,
                "description": "Percentage points.",
                "type": "number"
              },
              "viewMode": {
                "description": "large returns rich rows.",
                "pattern": "^[^\\x00]*$"
              }
            },
            "type": [
              "object",
              "null"
            ]
          },
          "wait_seconds": {
            "default": 0,
            "description": "Wait up to this many seconds (0-25; larger waits 25) after queueing. A job that finishes in time returns its get_job_status payload; otherwise the usual queued acknowledgement.",
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "issuer_id"
        ],
        "type": "object"
      },
      "name": "get_debt_details_dataset",
      "outputSchema": {
        "properties": {
          "result": {
            "additionalProperties": true,
            "type": "object"
          },
          "status": {
            "description": "Normalized outcome of this read-tool invocation.",
            "enum": [
              "ok",
              "validation_error",
              "constraint_unsatisfied",
              "authentication_error",
              "access_denied",
              "not_found",
              "conflict",
              "rate_limited",
              "client_error",
              "internal_error",
              "unavailable"
            ],
            "type": "string"
          },
          "status_code": {
            "description": "HTTP-style outcome code for this read-tool invocation.",
            "maximum": 599,
            "minimum": 100,
            "type": "integer"
          }
        },
        "required": [
          "result",
          "status",
          "status_code"
        ],
        "type": "object"
      },
      "title": "Get Debt Details Dataset"
    },
    {
      "access": {
        "approval_class": "read",
        "area_ids": [
          "debt_details"
        ],
        "min_tier": "free",
        "operation_effect": "read",
        "quota_tier": "read",
        "ref_prefixes": [],
        "required_scopes": [
          "debt.read"
        ],
        "requires_confirmation": false,
        "requires_owner_user": false,
        "requires_staff_owner": false,
        "scope_policy": ""
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Get an authenticated download locator for one file returned by list_issuer_files. Send the current MCP access token in the HTTP Authorization header; never put a token in a URL. The download rechecks profile, issuer access and current file selection.",
      "inputSchema": {
        "properties": {
          "file_id": {
            "type": "integer"
          },
          "issuer_id": {
            "type": "string"
          }
        },
        "required": [
          "issuer_id",
          "file_id"
        ],
        "type": "object"
      },
      "name": "get_issuer_file_download",
      "outputSchema": {
        "properties": {
          "result": {
            "additionalProperties": true,
            "type": "object"
          },
          "status": {
            "description": "Normalized outcome of this read-tool invocation.",
            "enum": [
              "ok",
              "validation_error",
              "constraint_unsatisfied",
              "authentication_error",
              "access_denied",
              "not_found",
              "conflict",
              "rate_limited",
              "client_error",
              "internal_error",
              "unavailable"
            ],
            "type": "string"
          },
          "status_code": {
            "description": "HTTP-style outcome code for this read-tool invocation.",
            "maximum": 599,
            "minimum": 100,
            "type": "integer"
          }
        },
        "required": [
          "result",
          "status",
          "status_code"
        ],
        "type": "object"
      },
      "title": "Get Issuer File Download"
    },
    {
      "access": {
        "approval_class": "read",
        "area_ids": [
          "financing_bond_math"
        ],
        "min_tier": "pro",
        "operation_effect": "read",
        "quota_tier": "read",
        "ref_prefixes": [
          "mcp-job-result://",
          "mcp-job://"
        ],
        "required_scopes": [
          "debt.write",
          "model.run",
          "debt.read"
        ],
        "requires_confirmation": false,
        "requires_owner_user": false,
        "requires_staff_owner": false,
        "scope_policy": "async_job_type_dependent"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Poll an owned async job through done, failed, or cancelled. A large done result returns result_paged plus a manifest whose schema-2 root binds result_outcome, truthful source metadata, and the professional-use notice; require the poll/manifest outcome copies to match. Apply the s000 root initializer before targeted child sections, and use complete global traversal for path=[] object_group results. Results expire after 48 hours. Every poll rechecks current live scope, tier, tenant, and owner access; versioned terminal-result access additionally rechecks the submit-time scope/tier snapshot and current borrower/scale authority.",
      "inputSchema": {
        "properties": {
          "job_ref": {
            "type": "string"
          },
          "wait_seconds": {
            "default": 0,
            "description": "Long-poll: wait up to this many seconds (0-25; larger waits 25) for done, failed or cancelled. 0 answers now. A wait that ends first returns the normal queued or running payload.",
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "job_ref"
        ],
        "type": "object"
      },
      "name": "get_job_status",
      "outputSchema": {
        "properties": {
          "result": {
            "additionalProperties": true,
            "type": "object"
          },
          "status": {
            "description": "Normalized outcome of this read-tool invocation.",
            "enum": [
              "ok",
              "validation_error",
              "constraint_unsatisfied",
              "authentication_error",
              "access_denied",
              "not_found",
              "conflict",
              "rate_limited",
              "client_error",
              "internal_error",
              "unavailable"
            ],
            "type": "string"
          },
          "status_code": {
            "description": "HTTP-style outcome code for this read-tool invocation.",
            "maximum": 599,
            "minimum": 100,
            "type": "integer"
          }
        },
        "required": [
          "result",
          "status",
          "status_code"
        ],
        "type": "object"
      },
      "title": "Get Job Status"
    },
    {
      "access": {
        "approval_class": "read",
        "area_ids": [],
        "min_tier": "free",
        "operation_effect": "read",
        "quota_tier": "read",
        "ref_prefixes": [
          "munipro-navigation://"
        ],
        "required_scopes": [],
        "requires_confirmation": false,
        "requires_owner_user": false,
        "requires_staff_owner": false,
        "scope_policy": "metadata_only"
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Return a model-sized index, complete area detail when area is set, or explicit full legacy detail.",
      "inputSchema": {
        "properties": {
          "area": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null
          },
          "detail": {
            "default": "auto",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "get_munipro_navigation",
      "outputSchema": {
        "properties": {
          "result": {
            "additionalProperties": true,
            "type": "object"
          },
          "status": {
            "description": "Normalized outcome of this read-tool invocation.",
            "enum": [
              "ok",
              "validation_error",
              "constraint_unsatisfied",
              "authentication_error",
              "access_denied",
              "not_found",
              "conflict",
              "rate_limited",
              "client_error",
              "internal_error",
              "unavailable"
            ],
            "type": "string"
          },
          "status_code": {
            "description": "HTTP-style outcome code for this read-tool invocation.",
            "maximum": 599,
            "minimum": 100,
            "type": "integer"
          }
        },
        "required": [
          "result",
          "status",
          "status_code"
        ],
        "type": "object"
      },
      "title": "Get MuniPro Navigation"
    },
    {
      "access": {
        "approval_class": "read",
        "area_ids": [
          "debt_details"
        ],
        "min_tier": "free",
        "operation_effect": "read",
        "quota_tier": "read",
        "ref_prefixes": [],
        "required_scopes": [
          "debt.read"
        ],
        "requires_confirmation": false,
        "requires_owner_user": false,
        "requires_staff_owner": false,
        "scope_policy": ""
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "List indexed Official Statements and all historical Financial Statements for a visible issuer's outstanding debt. kind: all, official_statement or financial_statement. Follow next_offset through every page (limit 1..200). GET download_url with the current MCP bearer for a PDF through MuniPro's proxy/cache; refresh the list after HTTP 410. source_url is public EMMA provenance; never send it a MuniPro token. Review conduit-issuer candidates and coverage gaps.",
      "inputSchema": {
        "properties": {
          "issuer_id": {
            "type": "string"
          },
          "kind": {
            "default": "all",
            "type": "string"
          },
          "limit": {
            "default": 50,
            "type": "integer"
          },
          "offset": {
            "default": 0,
            "type": "integer"
          }
        },
        "required": [
          "issuer_id"
        ],
        "type": "object"
      },
      "name": "list_issuer_debt_documents",
      "outputSchema": {
        "properties": {
          "result": {
            "additionalProperties": true,
            "type": "object"
          },
          "status": {
            "description": "Normalized outcome of this read-tool invocation.",
            "enum": [
              "ok",
              "validation_error",
              "constraint_unsatisfied",
              "authentication_error",
              "access_denied",
              "not_found",
              "conflict",
              "rate_limited",
              "client_error",
              "internal_error",
              "unavailable"
            ],
            "type": "string"
          },
          "status_code": {
            "description": "HTTP-style outcome code for this read-tool invocation.",
            "maximum": 599,
            "minimum": 100,
            "type": "integer"
          }
        },
        "required": [
          "result",
          "status",
          "status_code"
        ],
        "type": "object"
      },
      "title": "List Issuer Debt Documents"
    },
    {
      "access": {
        "approval_class": "read",
        "area_ids": [
          "debt_details"
        ],
        "min_tier": "free",
        "operation_effect": "read",
        "quota_tier": "read",
        "ref_prefixes": [],
        "required_scopes": [
          "debt.read"
        ],
        "requires_confirmation": false,
        "requires_owner_user": false,
        "requires_staff_owner": false,
        "scope_policy": ""
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "List the current uploaded debt-profile package and named attachments for a visible issuer. Returns stable file IDs, roles, upload dates, availability and bearer-authenticated download URLs. Includes Debt Profile, FY Debt Profile and .ddl files when present; excludes internal Django Upload inputs.",
      "inputSchema": {
        "properties": {
          "issuer_id": {
            "type": "string"
          }
        },
        "required": [
          "issuer_id"
        ],
        "type": "object"
      },
      "name": "list_issuer_files",
      "outputSchema": {
        "properties": {
          "result": {
            "additionalProperties": true,
            "type": "object"
          },
          "status": {
            "description": "Normalized outcome of this read-tool invocation.",
            "enum": [
              "ok",
              "validation_error",
              "constraint_unsatisfied",
              "authentication_error",
              "access_denied",
              "not_found",
              "conflict",
              "rate_limited",
              "client_error",
              "internal_error",
              "unavailable"
            ],
            "type": "string"
          },
          "status_code": {
            "description": "HTTP-style outcome code for this read-tool invocation.",
            "maximum": 599,
            "minimum": 100,
            "type": "integer"
          }
        },
        "required": [
          "result",
          "status",
          "status_code"
        ],
        "type": "object"
      },
      "title": "List Issuer Files"
    },
    {
      "access": {
        "approval_class": "read",
        "area_ids": [
          "borrowers"
        ],
        "min_tier": "free",
        "operation_effect": "read",
        "quota_tier": "read",
        "ref_prefixes": [
          "verified-borrowers://list"
        ],
        "required_scopes": [
          "debt.read"
        ],
        "requires_confirmation": false,
        "requires_owner_user": false,
        "requires_staff_owner": false,
        "scope_policy": ""
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "List up to 25 visible canonical borrowers per page. Rows preserve identity,\n        names and minimal refs. Each row's entry_actions contains stable string keys\n        into response row_actions; expand a selected template using that row's\n        action_arguments. Resolve {\"$row\": \"borrower_id\"} to the typed argument\n        value; in strings replace only literal {borrower_id} with that value.\n        Additional navigation refs and human pages are response-level\n        row_ref_templates and row_human_pages; row_ref_aliases maps former *_ref\n        field names to template keys. Leave other placeholders unresolved and\n        inspect action availability/scopes before calling. Follow refs.next_page\n        until complete for a full requested list. Pages have a 256 KiB serialized\n        result budget; returned_count reports retained rows. Optional until is\n        an exclusive end for backward pages (offset < until <= total_count):\n        return at most limit rows ending there, trimming from the start for the\n        budget. Follow refs.previous_page to traverse backward without gaps.\n        A single oversized boundary row is retained with budget_warning.\n        ",
      "inputSchema": {
        "properties": {
          "limit": {
            "default": 25,
            "description": "Compact verified borrower page size (maximum 25). Values above the maximum are clamped. Row entry_actions keys select response row_actions templates, bound by row action_arguments (typed $row markers or literal {borrower_id} string tokens); follow refs.next_page for the complete result.",
            "maximum": 25,
            "minimum": 1,
            "type": "integer"
          },
          "offset": {
            "default": 0,
            "type": "integer"
          },
          "q": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional borrower search text (maximum 512 characters). Longer values are refused with a validation error.",
            "maxLength": 512
          },
          "state": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null
          },
          "until": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null
          }
        },
        "type": "object"
      },
      "name": "list_verified_borrowers",
      "outputSchema": {
        "properties": {
          "result": {
            "additionalProperties": true,
            "type": "object"
          },
          "status": {
            "description": "Normalized outcome of this read-tool invocation.",
            "enum": [
              "ok",
              "validation_error",
              "constraint_unsatisfied",
              "authentication_error",
              "access_denied",
              "not_found",
              "conflict",
              "rate_limited",
              "client_error",
              "internal_error",
              "unavailable"
            ],
            "type": "string"
          },
          "status_code": {
            "description": "HTTP-style outcome code for this read-tool invocation.",
            "maximum": 599,
            "minimum": 100,
            "type": "integer"
          }
        },
        "required": [
          "result",
          "status",
          "status_code"
        ],
        "type": "object"
      },
      "title": "List Verified Borrowers"
    },
    {
      "access": {
        "approval_class": "confirmed_write",
        "area_ids": [
          "borrowers"
        ],
        "min_tier": "professional",
        "operation_effect": "confirmed_workspace_change",
        "quota_tier": "write",
        "ref_prefixes": [],
        "required_scopes": [
          "borrowers.request"
        ],
        "requires_confirmation": true,
        "requires_owner_user": true,
        "requires_staff_owner": false,
        "scope_policy": ""
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Prepare a request for MuniPro staff to verify a borrower's debt. Requires borrowers.request and approval in the authenticated MuniPro session. Supply borrower name, state, optional six-character CUSIP issuer prefix and category. Approval creates a pending coverage-review request for your company; it does not verify, edit or publish debt. Equivalent pending requests are deduplicated within the company.",
      "inputSchema": {
        "properties": {
          "category": {
            "default": "",
            "type": "string"
          },
          "cusip6": {
            "default": "",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "state": {
            "type": "string"
          }
        },
        "required": [
          "name",
          "state"
        ],
        "type": "object"
      },
      "name": "request_borrower_verification",
      "outputSchema": {
        "properties": {
          "result": {
            "additionalProperties": true,
            "type": "object"
          }
        },
        "required": [
          "result"
        ],
        "type": "object"
      },
      "title": "Request Borrower Verification"
    }
  ],
  "notes": [
    "Maximum profile; live scope, tier, host, owner and record checks can narrow it.",
    "Interpret required_scopes using scope_policy; async_job_type_dependent follows the original job, not every listed scope.",
    "JSON and files: /api/assistant/v1/banker/ with current MCP OAuth bearer.",
    "Source schema is not deployment or actual-client acceptance evidence."
  ]
}
