{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://apievangelist.com/schemas/mkdocs/mkdocs-config.json",
  "title": "MkDocs Configuration",
  "description": "Schema for the MkDocs project configuration file (mkdocs.yml). Defines all settings that control site metadata, navigation, themes, plugins, Markdown extensions, and build behavior for generating static documentation sites.",
  "type": "object",
  "required": ["site_name"],
  "properties": {
    "site_name": {
      "type": "string",
      "description": "The main title for the project documentation site. This required setting is passed as the site_name context variable when rendering the theme.",
      "minLength": 1
    },
    "site_url": {
      "type": "string",
      "format": "uri",
      "description": "The full canonical URL where the documentation will be hosted. Used to add a canonical link tag to each HTML page and to configure the dev server mount path."
    },
    "site_description": {
      "type": "string",
      "description": "A description for the documentation project added to the HTML meta tags."
    },
    "site_author": {
      "type": "string",
      "description": "The name of the author added to the HTML meta tags."
    },
    "repo_url": {
      "type": "string",
      "format": "uri",
      "description": "URL to the source repository (GitHub, Bitbucket, GitLab, etc.). When set, provides a link to the repository on each documentation page."
    },
    "repo_name": {
      "type": "string",
      "description": "Display name for the repository link. Defaults to 'GitHub', 'Bitbucket', or 'GitLab' when the repo_url matches those domains, otherwise uses the hostname."
    },
    "edit_uri": {
      "type": "string",
      "description": "Path from repo_url to the docs directory for direct page editing links. Automatically set for known hosts (GitHub, GitLab, Bitbucket). Set to empty string to disable."
    },
    "edit_uri_template": {
      "type": "string",
      "description": "More flexible alternative to edit_uri using Python format strings. Supports {path}, {path_noext}, and {path!q} (percent-encoded). Mutually exclusive with edit_uri."
    },
    "docs_dir": {
      "type": "string",
      "description": "The directory containing the documentation Markdown source files.",
      "default": "docs"
    },
    "site_dir": {
      "type": "string",
      "description": "The output directory where the generated static site files will be written.",
      "default": "site"
    },
    "copyright": {
      "type": "string",
      "description": "A copyright notice to add to the footer of documentation pages."
    },
    "nav": {
      "description": "Defines the navigation structure of the documentation site as a list of title-to-path mappings or nested sections.",
      "$ref": "#/$defs/NavItem"
    },
    "exclude_docs": {
      "type": "string",
      "description": "Gitignore-style patterns of files relative to the docs directory to exclude from the site build."
    },
    "draft_docs": {
      "type": "string",
      "description": "Gitignore-style patterns of files relative to the docs directory to mark as drafts. Draft pages are excluded from production builds."
    },
    "not_in_nav": {
      "type": "string",
      "description": "Gitignore-style patterns of files relative to the docs directory that are intentionally not included in the nav (suppresses warning log messages)."
    },
    "theme": {
      "description": "The MkDocs theme configuration. Can be a string theme name or an object with theme name and options.",
      "oneOf": [
        {
          "type": "string",
          "description": "Theme name string shorthand (e.g., 'mkdocs', 'readthedocs').",
          "enum": ["mkdocs", "readthedocs"]
        },
        {
          "$ref": "#/$defs/ThemeConfig"
        }
      ],
      "default": "mkdocs"
    },
    "dev_addr": {
      "type": "string",
      "description": "The IP address and port for the local development server started by mkdocs serve.",
      "default": "127.0.0.1:8000",
      "pattern": "^.+:[0-9]+$"
    },
    "use_directory_urls": {
      "type": "boolean",
      "description": "When true, generates page_name/index.html style URLs. When false, generates page_name.html style files. True generates cleaner URLs.",
      "default": true
    },
    "strict": {
      "type": "boolean",
      "description": "When true, enables strict mode which stops the build on warnings rather than continuing.",
      "default": false
    },
    "remote_branch": {
      "type": "string",
      "description": "The remote branch to commit to when deploying with mkdocs gh-deploy.",
      "default": "gh-pages"
    },
    "remote_name": {
      "type": "string",
      "description": "The remote name to push to when deploying with mkdocs gh-deploy.",
      "default": "origin"
    },
    "extra_css": {
      "type": "array",
      "description": "List of additional CSS files from the docs directory to include in the generated site.",
      "items": {
        "type": "string",
        "description": "Path to a CSS file relative to the docs directory."
      },
      "default": []
    },
    "extra_javascript": {
      "type": "array",
      "description": "List of additional JavaScript files from the docs directory to include in the generated site. Items can be strings or script objects with defer/async attributes.",
      "items": {
        "oneOf": [
          {
            "type": "string",
            "description": "Path to a JavaScript file relative to the docs directory."
          },
          {
            "$ref": "#/$defs/ExtraScript"
          }
        ]
      },
      "default": []
    },
    "extra_templates": {
      "type": "array",
      "description": "List of additional Jinja2 HTML or XML template files to build with the global context.",
      "items": {
        "type": "string",
        "description": "Path to a template file."
      },
      "default": []
    },
    "markdown_extensions": {
      "type": "array",
      "description": "List of Python-Markdown extension names or extension configuration objects to enable. Built-in extensions (toc, tables, fenced_code) are always enabled.",
      "items": {
        "oneOf": [
          {
            "type": "string",
            "description": "Python-Markdown extension name."
          },
          {
            "type": "object",
            "description": "Extension name mapped to its configuration options.",
            "additionalProperties": {
              "type": "object"
            }
          }
        ]
      }
    },
    "plugins": {
      "type": "array",
      "description": "List of MkDocs plugins to use during the build. Each item is either a plugin name string or a mapping of plugin name to its configuration options.",
      "items": {
        "oneOf": [
          {
            "type": "string",
            "description": "Plugin name as registered via the mkdocs.plugins entry point group."
          },
          {
            "type": "object",
            "description": "Plugin name mapped to its configuration options.",
            "additionalProperties": {
              "type": "object"
            }
          }
        ]
      },
      "default": ["search"]
    },
    "hooks": {
      "type": "array",
      "description": "List of Python script filenames to import as plugin instances. Hooks allow local plugin-like customization without packaging.",
      "items": {
        "type": "string",
        "description": "Path to a Python script file to use as a hook."
      }
    },
    "watch": {
      "type": "array",
      "description": "Additional paths to watch for changes during mkdocs serve (triggers live reload).",
      "items": {
        "type": "string",
        "description": "File system path to watch."
      },
      "default": []
    },
    "extra": {
      "type": "object",
      "description": "A mapping of arbitrary data passed to the Jinja2 template context. Allows theme authors to require extra configuration data without explicit MkDocs support.",
      "additionalProperties": true
    },
    "validation": {
      "$ref": "#/$defs/ValidationConfig",
      "description": "Configuration for MkDocs validation warnings emitted during the build."
    }
  },
  "$defs": {
    "NavItem": {
      "description": "A navigation item which can be a list of title-to-path mappings or nested sections.",
      "type": "array",
      "items": {
        "oneOf": [
          {
            "type": "object",
            "description": "A navigation entry mapping a display title to a page path or a nested list of nav items.",
            "additionalProperties": {
              "oneOf": [
                {
                  "type": "string",
                  "description": "Path to the Markdown file relative to the docs directory."
                },
                {
                  "$ref": "#/$defs/NavItem"
                }
              ]
            }
          }
        ]
      }
    },
    "ThemeConfig": {
      "type": "object",
      "description": "Full theme configuration object specifying theme name and theme-specific options.",
      "required": ["name"],
      "properties": {
        "name": {
          "type": "string",
          "description": "The theme name. Use null to use a custom theme without a base theme.",
          "enum": ["mkdocs", "readthedocs"]
        },
        "custom_dir": {
          "type": "string",
          "description": "Path to a directory of custom theme overrides. Files here override corresponding theme files."
        },
        "static_templates": {
          "type": "array",
          "description": "List of templates to render as static pages even without a corresponding Markdown source.",
          "items": {
            "type": "string"
          }
        },
        "locale": {
          "type": "string",
          "description": "The locale (language code) for theme localization, e.g. 'en', 'fr', 'de'."
        },
        "language": {
          "type": "string",
          "description": "Alias for locale used by some themes."
        }
      },
      "additionalProperties": true
    },
    "ExtraScript": {
      "type": "object",
      "description": "A JavaScript file reference with optional loading attributes.",
      "required": ["path"],
      "properties": {
        "path": {
          "type": "string",
          "description": "Path to the JavaScript file relative to the docs directory."
        },
        "defer": {
          "type": "boolean",
          "description": "When true, adds the defer attribute to the script tag.",
          "default": false
        },
        "async": {
          "type": "boolean",
          "description": "When true, adds the async attribute to the script tag.",
          "default": false
        },
        "type": {
          "type": "string",
          "description": "The type attribute for the script tag (e.g., 'module')."
        }
      }
    },
    "ValidationConfig": {
      "type": "object",
      "description": "Controls validation behavior and warning levels during site builds.",
      "properties": {
        "nav": {
          "$ref": "#/$defs/NavValidationConfig"
        },
        "links": {
          "$ref": "#/$defs/LinksValidationConfig"
        }
      }
    },
    "NavValidationConfig": {
      "type": "object",
      "description": "Validation settings for navigation structure.",
      "properties": {
        "omitted_files": {
          "type": "string",
          "description": "Warning level when a doc file is never mentioned in the navigation.",
          "enum": ["warn", "info", "ignore"],
          "default": "info"
        },
        "not_found": {
          "type": "string",
          "description": "Warning level when navigation links to a relative path that does not exist as a page.",
          "enum": ["warn", "info", "ignore"],
          "default": "warn"
        },
        "absolute_links": {
          "type": "string",
          "description": "Warning level when navigation links to an absolute path starting with /.",
          "enum": ["warn", "info", "ignore", "relative_to_docs"],
          "default": "info"
        }
      }
    },
    "LinksValidationConfig": {
      "type": "object",
      "description": "Validation settings for in-page Markdown links.",
      "properties": {
        "not_found": {
          "type": "string",
          "description": "Warning level when a Markdown doc links to a relative path that does not exist.",
          "enum": ["warn", "info", "ignore"],
          "default": "warn"
        },
        "absolute_links": {
          "type": "string",
          "description": "Warning level when a Markdown doc links to an absolute path starting with /.",
          "enum": ["warn", "info", "ignore", "relative_to_docs"],
          "default": "info"
        },
        "unrecognized_links": {
          "type": "string",
          "description": "Warning level when a Markdown doc links to a relative path that does not look like a valid internal link (e.g., ends with /).",
          "enum": ["warn", "info", "ignore"],
          "default": "info"
        },
        "anchors": {
          "type": "string",
          "description": "Warning level when a Markdown doc links to an anchor not present on the target page.",
          "enum": ["warn", "info", "ignore"],
          "default": "info"
        }
      }
    }
  }
}
