{
  "schema_version": "1.0.0",
  "package_version": "0.1.0",
  "service": {
    "name": "IRP local agent tools",
    "description": "Curated deterministic transformations for browser and local headless agents.",
    "execution": "local",
    "user_data_transmission": false,
    "persistence": false,
    "remote_api": false,
    "remote_mcp": false,
    "surfaces": {
      "stdio_mcp": {
        "availability": "preview",
        "static_network_requests": false,
        "timeout_enforced": true
      },
      "browser_webmcp": {
        "availability": "experimental_opt_in",
        "static_network_requests": true,
        "timeout_enforced": false
      }
    }
  },
  "limits": {
    "input_bytes": 262144,
    "stdio_output_bytes": 1048576,
    "stdio_timeout_ms": 10000,
    "browser_input_bytes": 16384,
    "browser_output_bytes": 16384,
    "max_concurrency": 2,
    "max_queue": 4
  },
  "receipt_schema": {
    "type": "object",
    "additionalProperties": false,
    "required": [
      "tool_id",
      "tool_version",
      "output",
      "warnings",
      "usage",
      "execution"
    ],
    "properties": {
      "tool_id": {
        "type": "string",
        "pattern": "^irp_[a-z0-9_]+$"
      },
      "tool_version": {
        "type": "string",
        "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
      },
      "output": {
        "type": "string"
      },
      "warnings": {
        "type": "array",
        "items": {
          "type": "string"
        }
      },
      "usage": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "input_bytes",
          "output_bytes"
        ],
        "properties": {
          "input_bytes": {
            "type": "integer",
            "minimum": 0
          },
          "output_bytes": {
            "type": "integer",
            "minimum": 0
          }
        }
      },
      "execution": {
        "const": "local"
      }
    }
  },
  "tools": [
    {
      "id": "irp_csv_to_json",
      "slug": "cc-csv-to-json",
      "version": "1.0.0",
      "title": "CSV to JSON",
      "description": "Convert RFC 4180-style CSV text to formatted JSON. Use for tabular text with quoted fields, optional headers, and CRLF or LF rows. Do not use for spreadsheet files or arbitrary delimiters.",
      "web_route": "/c/code?t=cc-csv-to-json",
      "cli_script": "data/csv-to-json.js",
      "input_media_type": "text/csv",
      "output_media_type": "application/json",
      "input_schema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "input"
        ],
        "properties": {
          "input": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144,
            "description": "CSV source text. The byte limit is enforced separately after UTF-8 encoding."
          },
          "has_header": {
            "type": "boolean",
            "default": true,
            "description": "Whether the first CSV row contains column names."
          },
          "headers": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128
            },
            "minItems": 1,
            "maxItems": 256,
            "description": "Column names to use when has_header is false."
          },
          "empty_as": {
            "type": "string",
            "enum": [
              "null",
              "empty"
            ],
            "default": "null",
            "description": "Represent empty cells as JSON null or an empty string."
          }
        }
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "untrustedContentHint": true
      },
      "example": {
        "input": "name,score\nAda,10\nLin,",
        "empty_as": "null"
      }
    },
    {
      "id": "irp_json_to_yaml",
      "slug": "cc-json-to-yaml",
      "version": "1.0.0",
      "title": "JSON to YAML",
      "description": "Convert valid JSON text to YAML while preserving nested objects, arrays, scalar types, and strings. Use when a text YAML representation is required; malformed JSON fails without partial output.",
      "web_route": "/c/code?t=cc-json-to-yaml",
      "cli_script": "data/json-to-yaml.js",
      "input_media_type": "application/json",
      "output_media_type": "application/yaml",
      "input_schema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "input"
        ],
        "properties": {
          "input": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144,
            "description": "Valid JSON source text. The byte limit is enforced separately after UTF-8 encoding."
          }
        }
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "untrustedContentHint": true
      },
      "example": {
        "input": "{\"name\":\"Ada\",\"active\":true,\"tags\":[\"math\",\"code\"]}"
      }
    },
    {
      "id": "irp_json_to_typescript",
      "slug": "cc-json-to-typescript",
      "version": "1.0.0",
      "title": "JSON to TypeScript",
      "description": "Infer TypeScript interface declarations from representative valid JSON. Use for a typed starting point that a developer will review; the output describes the supplied sample and is not a guarantee about unseen data.",
      "web_route": "/c/code?t=cc-json-to-typescript",
      "cli_script": "schema/json-to-typescript.js",
      "input_media_type": "application/json",
      "output_media_type": "text/typescript",
      "input_schema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "input"
        ],
        "properties": {
          "input": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144,
            "description": "Representative valid JSON source text. The byte limit is enforced separately after UTF-8 encoding."
          },
          "root_name": {
            "type": "string",
            "pattern": "^[A-Za-z_$][A-Za-z0-9_$]{0,63}$",
            "default": "Root",
            "description": "Valid TypeScript identifier for the root interface."
          }
        }
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "untrustedContentHint": true
      },
      "example": {
        "input": "{\"id\":1,\"profile\":{\"name\":\"Ada\"},\"roles\":[\"admin\"]}",
        "root_name": "User"
      }
    }
  ]
}
