{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$defs": {
    "primitives": {
      // All supported primitive data types
      "type": "string",
      "enum": ["string", "integer", "number", "boolean", "json"]
    },
    "value_schema": {
      // Represents the schema of a value (e.g. function input parameter value)
      "type": "object",
      "properties": {
        "val_type": {
          "oneOf": [{ "$ref": "#/$defs/primitives" }, { "type": "string", "enum": ["array"] }]
        },
        "inner_val_type": {
          "description": "If the value type is a list, the type of the list values.",
          "oneOf": [{ "$ref": "#/$defs/primitives" }, { "type": "null" }]
        },
        "enum": {
          "oneOf": [
            { "type": "null" }, // Can be unset
            {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          ]
        }
      },
      "required": ["val_type"],
      "additionalProperties": false,
      "if": {
        "properties": { "val_type": { "const": "array" } }
      },
      "then": {
        "required": ["inner_val_type"]
      }
    }
  },
  "type": "object",
  "properties": {
    "$schema": {
      // Explicitly allow JSON-Schema to be referenced (due to additionalProperties: false)
      "type": "string",
      "format": "uri"
    },
    "name": {
      "type": "string",
      "description": "The tool name"
    },
    "fully_qualified_name": {
      "type": "string",
      "description": "The tool's fully-qualified name"
    },
    "description": {
      "type": "string",
      "description": "A human-readable description of the tool and when to use it"
    },
    "toolkit": {
      "type": "object",
      "description": "The toolkit that contains the tool",
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of the toolkit"
        },
        "description": {
          "type": "string",
          "description": "A human-readable description of the toolkit"
        },
        "version": {
          "type": "string",
          "description": "An identifier for this version of the toolkit"
        }
      },
      "required": ["name", "version"],
      "additionalProperties": false
    },
    "input": {
      "type": "object",
      "properties": {
        "parameters": {
          "type": "array",
          "minItems": 0,
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "description": "The human-readable name of this parameter.",
                "type": "string"
              },
              "required": {
                "description": "Whether this parameter is required (true) or optional (false).",
                "type": "boolean"
              },
              "description": {
                "description": "A descriptive, human-readable explanation of the parameter.",
                "type": "string"
              },
              "value_schema": {
                "$ref": "#/$defs/value_schema"
              },
              "inferrable": {
                "type": "boolean",
                "description": "Whether a value for this parameter can be inferred by a model. Defaults to `true`.",
                "default": true
              }
            },
            "required": ["name", "required", "value_schema"],
            "additionalProperties": false
          }
        }
      },
      "required": ["parameters"],
      "additionalProperties": false
    },
    "output": {
      "type": "object",
      "properties": {
        "available_modes": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "string",
            "enum": ["value", "error", "null", "artifact", "requires_authorization"]
          }
        },
        "description": {
          "description": "A descriptive, human-readable explanation of the function's output.",
          "type": "string"
        },
        "value_schema": {
          "$ref": "#/$defs/value_schema"
        }
      },
      "required": ["available_modes"],
      "additionalProperties": false
    },
    "requirements": {
      "type": "object",
      "properties": {
        "secrets": {
          "oneOf": [
            { "type": "null" }, // Can be unset,
            {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "key": {
                    "type": "string"
                  }
                },
                "required": ["key"],
                "additionalProperties": false
              }
            }
          ]
        },
        "metadata": {
          "oneOf": [
            { "type": "null" }, // Can be unset,
            {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "key": {
                    "type": "string"
                  }
                },
                "required": ["key"],
                "additionalProperties": false
              }
            }
          ]
        },
        "authorization": {
          "oneOf": [
            { "type": "null" }, // Can be unset
            {
              "type": "string",
              "enum": ["none", "token"]
            },
            {
              "type": "object",
              "properties": {
                "provider_id": {
                  "type": "string",
                  "description": "The provider ID configured in Arcade that acts as an alias to well-known configuration."
                },
                "provider_type": {
                  "type": "string",
                  "description": "The type of the authorization provider."
                },
                "id": {
                  "type": "string",
                  "description": "A provider's unique identifier, allowing the tool to specify a specific authorization provider. Recommended for private tools only."
                },
                "oauth2": {
                  "type": "object",
                  "properties": {
                    "scopes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "additionalProperties": false
                }
              },
              "required": ["provider_type"],
              "additionalProperties": false
            }
          ]
        }
      },
      "additionalProperties": false
    }
  },
  "required": ["name", "fully_qualified_name", "toolkit", "input", "output"],
  "additionalProperties": false
}
