{
  "openapi": "3.1.0",
  "security": [],
  "info": {
    "title": "nhanaz.io.vn public resources and page-view counter",
    "version": "2026-08-24",
    "description": "A small OpenAPI description of the public resources on nhanaz.io.vn. Document routes are read-only retrieval. The page-view counter is a public GET compatibility endpoint that increments a count unless readOnly=true, and it does not accept credentials or change site content. The versioned API surface is under /api/v1; /api/views remains a compatibility alias. No deprecation or sunset is scheduled for the compatibility alias.",
    "x-api-versioning": {
      "strategy": "URL path",
      "current": "/api/v1",
      "compatibilityAlias": "/api/views",
      "deprecationPolicy": "No deprecation or sunset is scheduled. If that changes, the canonical developer page and this document will be updated first."
    },
    "x-authentication": "none"
  },
  "servers": [
    {
      "url": "https://nhanaz.io.vn"
    }
  ],
  "paths": {
    "/index.md": {
      "get": {
        "operationId": "getHomeMarkdown",
        "summary": "Read the home page in Markdown",
        "description": "Returns the short Markdown entry point for the personal archive.",
        "responses": {
          "200": {
            "description": "Markdown document",
            "content": {
              "text/markdown": {
                "schema": { "type": "string" }
              }
            }
          }
        }
      }
    },
    "/llms.txt": {
      "get": {
        "operationId": "getLlmsIndex",
        "summary": "Read the short machine-readable index",
        "description": "Returns routing notes and canonical links for agents.",
        "responses": {
          "200": {
            "description": "Plain-text machine-readable index",
            "content": {
              "text/plain": {
                "schema": { "type": "string" }
              }
            }
          }
        }
      }
    },
    "/llms-full.txt": {
      "get": {
        "operationId": "getLlmsFullContext",
        "summary": "Read the full machine-readable context",
        "description": "Returns the longer source-bounded context for the archive.",
        "responses": {
          "200": {
            "description": "Plain-text context document",
            "content": {
              "text/plain": {
                "schema": { "type": "string" }
              }
            }
          }
        }
      }
    },
    "/agent.md": {
      "get": {
        "operationId": "getAgentGuidance",
        "summary": "Read agent routing guidance",
        "description": "Returns guidance about when this personal archive is an appropriate source.",
        "responses": {
          "200": {
            "description": "Markdown guidance document",
            "content": {
              "text/markdown": {
                "schema": { "type": "string" }
              }
            }
          }
        }
      }
    },
    "/developers.md": {
      "get": {
        "operationId": "getDeveloperResources",
        "summary": "Read developer and agent resource notes",
        "description": "Returns the limits and machine-readable entry points for this static site.",
        "responses": {
          "200": {
            "description": "Markdown developer resource document",
            "content": {
              "text/markdown": {
                "schema": { "type": "string" }
              }
            }
          }
        }
      }
    },
    "/entity.json": {
      "get": {
        "operationId": "getEntityGraph",
        "summary": "Read the public identity graph",
        "description": "Returns the site's public JSON-LD entity graph.",
        "responses": {
          "200": {
            "description": "JSON-LD entity graph",
            "content": {
              "application/ld+json": {
                "schema": { "type": "object" }
              },
              "application/json": {
                "schema": { "type": "object" }
              }
            }
          }
        }
      }
    },
    "/sitemap.xml": {
      "get": {
        "operationId": "getSitemap",
        "summary": "Read canonical public URLs",
        "description": "Returns the XML sitemap for indexable public pages.",
        "responses": {
          "200": {
            "description": "XML sitemap",
            "content": {
              "application/xml": {
                "schema": { "type": "string" }
              }
            }
          }
        }
      }
    },
    "/.well-known/ai-catalog.json": {
      "get": {
        "operationId": "getAgentResourceCatalog",
        "summary": "Read the ARD catalog",
        "description": "Returns the domain-anchored catalog of read-only Markdown resources.",
        "responses": {
          "200": {
            "description": "Agentic Resource Discovery catalog",
            "content": {
              "application/json": {
                "schema": { "type": "object" }
              }
            }
          }
        }
      }
    },
    "/.well-known/agent-skills/index.json": {
      "get": {
        "operationId": "getAgentSkillsIndex",
        "summary": "Read the Agent Skills discovery index",
        "description": "Returns the read-only skill index for the archive.",
        "responses": {
          "200": {
            "description": "Agent Skills discovery document",
            "content": {
              "application/json": {
                "schema": { "type": "object" }
              }
            }
          }
        }
      }
    },
    "/api/views": {
      "get": {
        "operationId": "getAndIncrementPageViews",
        "summary": "Increment and read a public page-view count",
        "description": "Increments the view count for one normalized public path and returns the new total. This endpoint does not accept credentials and cannot change site content. Versioning policy: /api/views is a compatibility alias, not deprecated today. If that status changes, the response will publish standard Deprecation and Sunset headers and the documented timeline will be updated before removal.",
        "x-deprecation-policy": {
          "status": "active-compatibility-alias",
          "deprecationSignal": "Deprecation header",
          "sunsetSignal": "Sunset header",
          "notice": "No deprecation or sunset is currently scheduled."
        },
        "parameters": [
          {
            "name": "path",
            "in": "query",
            "required": true,
            "description": "The public path to count, such as /posts/chao-internet/.",
            "schema": {
              "type": "string",
              "pattern": "^/",
              "maxLength": 200
            }
          },
          {
            "name": "readOnly",
            "in": "query",
            "required": false,
            "description": "When true, read the existing total without incrementing it. This is the mode used by the product MCP surface.",
            "schema": { "type": "boolean", "default": false }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional retry key. Because this is a GET counter operation, a repeated key for the same path returns the original result instead of incrementing again. Keys are retained for 24 hours.",
            "schema": { "type": "string", "minLength": 1, "maxLength": 200 }
          }
        ],
        "responses": {
          "200": {
            "description": "Updated public view count",
            "headers": {
              "RateLimit-Policy": { "schema": { "type": "string", "example": "60;w=60" } },
              "RateLimit": { "schema": { "type": "string", "example": "limit=60, remaining=59, reset=42" } },
              "RateLimit-Limit": { "schema": { "type": "string", "example": "60;w=60" } },
              "RateLimit-Remaining": { "schema": { "type": "integer", "minimum": 0 } },
              "RateLimit-Reset": { "schema": { "type": "integer", "minimum": 0 } },
              "Deprecation": { "description": "Not emitted while this compatibility alias remains active.", "schema": { "type": "string" } },
              "Sunset": { "description": "If a removal is scheduled, this HTTP date will be published at least 90 days ahead.", "schema": { "type": "string" } },
              "Link": { "description": "When deprecation is scheduled, links to the migration policy and replacement route.", "schema": { "type": "string" } }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["path", "views"],
                  "properties": {
                    "path": { "type": "string" },
                    "views": { "type": "integer", "minimum": 1 }
                  },
                  "additionalProperties": false
                }
              }
            }
          },
          "400": {
            "description": "Invalid or missing path",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object", "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "405": {
            "description": "Only GET is supported",
            "headers": {
              "Allow": {
                "schema": { "type": "string", "example": "GET" }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object", "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "503": {
            "description": "Counter storage is not configured or unavailable",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object", "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "headers": {
              "RateLimit-Policy": { "schema": { "type": "string", "example": "60;w=60" } },
              "RateLimit": { "schema": { "type": "string", "example": "limit=60, remaining=0, reset=60" } },
              "RateLimit-Limit": { "schema": { "type": "string", "example": "60;w=60" } },
              "RateLimit-Remaining": { "schema": { "type": "integer", "minimum": 0 } },
              "RateLimit-Reset": { "schema": { "type": "integer", "description": "Unix seconds until the current window resets." } },
              "Retry-After": { "schema": { "type": "integer", "minimum": 1 } }
            },
            "content": {
              "application/problem+json": {
                "schema": { "type": "object", "$ref": "#/components/schemas/ProblemDetails" }
              }
            }
          }
        }
      }
    },
    "/api/v1/views": {
      "get": {
        "operationId": "getAndIncrementPageViewsV1",
        "summary": "Increment and read a public page-view count (v1)",
        "description": "Versioned v1 route for the public page-view counter. A normal GET increments the count, while readOnly=true reads the existing total without incrementing it. Idempotency-Key can make a retried increment safe for the same path for 24 hours. The unversioned /api/views route remains available as a compatibility alias. This endpoint does not accept credentials and cannot change site content.",
        "parameters": [
          {
            "$ref": "#/paths/~1api~1views/get/parameters/0"
          },
          {
            "$ref": "#/paths/~1api~1views/get/parameters/1"
          },
          {
            "$ref": "#/paths/~1api~1views/get/parameters/2"
          }
        ],
        "responses": {
          "200": { "description": "Page-view count", "content": { "application/json": { "schema": { "type": "object", "required": ["path", "views"], "properties": { "path": { "type": "string" }, "views": { "type": "integer", "minimum": 0 }, "readOnly": { "type": "boolean" } }, "additionalProperties": false } } } },
          "400": { "$ref": "#/paths/~1api~1views/get/responses/400" },
          "405": { "$ref": "#/paths/~1api~1views/get/responses/405" },
          "503": { "$ref": "#/paths/~1api~1views/get/responses/503" },
          "429": { "$ref": "#/paths/~1api~1views/get/responses/429" }
        }
      }
    },
    "/api/batch": {
      "post": {
        "operationId": "batchReadPublicResources",
        "summary": "Read several allowlisted public resources",
        "description": "Fetches 1-8 public machine-readable resources in one read-only request. It never follows arbitrary hosts and does not change content.",
        "parameters": [{ "$ref": "#/components/parameters/IdempotencyKey" }],
        "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BatchRequest" } } } },
        "responses": {
          "200": { "description": "Batch resource result", "content": { "application/json": { "schema": { "type": "object", "required": ["readOnly", "count", "results"], "properties": { "readOnly": { "const": true }, "count": { "type": "integer", "minimum": 1, "maximum": 8 }, "results": { "type": "array", "items": { "type": "object", "required": ["url", "status", "contentType"], "properties": { "url": { "type": "string", "format": "uri" }, "status": { "type": "integer" }, "contentType": { "type": "string" }, "content": { "type": ["string", "null"] } }, "additionalProperties": false } } }, "additionalProperties": false } } } },
          "400": { "description": "Invalid or non-allowlisted batch", "content": { "application/problem+json": { "schema": { "type": "object", "$ref": "#/components/schemas/ProblemDetails" } } } }
        }
      }
    },
    "/ask": {
      "get": {
        "operationId": "askArchive",
        "summary": "Search the public archive with NLWeb",
        "description": "Returns ranked links from a small, curated index of public NhanAZ pages. It does not call an LLM, mutate content, or require credentials.",
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Natural-language search query.",
            "schema": { "type": "string", "minLength": 1, "maxLength": 500 }
          },
          {
            "name": "streaming",
            "in": "query",
            "required": false,
            "description": "Use false for a JSON response. The default for an event-stream request is true.",
            "schema": { "type": "boolean", "default": false }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of results in this page.",
            "schema": { "type": "integer", "minimum": 1, "maximum": 12, "default": 8 }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque pagination cursor returned as `pagination.nextCursor`.",
            "schema": { "type": "string" }
          }
        ],
        "responses": {
          "200": {
            "description": "NLWeb search response or event stream",
            "content": {
              "application/json": { "schema": { "type": "object", "required": ["_meta", "query_id", "results"], "properties": { "_meta": { "type": "object" }, "query_id": { "type": "string" }, "mode": { "type": "string" }, "summary": { "type": "string" }, "results": { "type": "array", "items": { "type": "object" } }, "pagination": { "type": "object" } }, "additionalProperties": false } },
              "text/event-stream": { "schema": { "type": "string" } }
            }
          },
          "400": { "description": "Invalid query", "content": { "application/problem+json": { "schema": { "type": "object", "$ref": "#/components/schemas/ProblemDetails" } } } }
        }
      },
      "post": {
        "operationId": "askArchivePost",
        "summary": "Search the public archive with NLWeb",
        "description": "NLWeb-compatible POST form. The response is read-only and uses the `_meta.response_type` and `_meta.version` fields.",
        "parameters": [{ "$ref": "#/components/parameters/IdempotencyKey" }],
        "requestBody": {
          "required": true,
          "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AskRequest" } } }
        },
        "responses": {
          "200": { "description": "NLWeb response", "content": { "application/json": { "schema": { "type": "object", "required": ["_meta", "query_id", "results"], "properties": { "_meta": { "type": "object" }, "query_id": { "type": "string" }, "mode": { "type": "string" }, "summary": { "type": "string" }, "results": { "type": "array", "items": { "type": "object" } }, "pagination": { "type": "object" } }, "additionalProperties": false } }, "text/event-stream": { "schema": { "type": "string" } } } },
          "400": { "description": "Invalid query", "content": { "application/problem+json": { "schema": { "type": "object", "$ref": "#/components/schemas/ProblemDetails" } } } }
        }
      }
    },
    "/mcp": {
      "get": {
        "operationId": "getMcpServerInfo",
        "summary": "Read MCP server transport information",
        "description": "Returns public capabilities for the stateless, read-only Streamable HTTP MCP surface.",
        "responses": { "200": { "description": "MCP server information", "content": { "application/json": { "schema": { "type": "object", "required": ["protocolVersion", "serverInfo", "capabilities"], "properties": { "protocolVersion": { "type": "string" }, "serverInfo": { "type": "object" }, "capabilities": { "type": "object" }, "endpoint": { "type": "string", "format": "uri" } }, "additionalProperties": true } } } } }
      },
      "post": {
        "operationId": "callMcp",
        "summary": "Call the read-only MCP server",
        "description": "Accepts JSON-RPC MCP requests such as initialize, tools/list, resources/list, resources/read, and tools/call. No credentials are required.",
        "parameters": [{ "$ref": "#/components/parameters/IdempotencyKey" }],
        "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/McpRequest" } } } },
        "responses": {
          "200": { "description": "MCP JSON-RPC response", "content": { "application/json": { "schema": { "type": "object", "required": ["jsonrpc"], "properties": { "jsonrpc": { "const": "2.0" }, "id": {}, "result": {}, "error": { "type": "object" } }, "additionalProperties": true } } } },
          "400": { "description": "Malformed JSON-RPC request", "content": { "application/json": { "schema": { "type": "object", "$ref": "#/components/schemas/ProblemDetails" } } } }
        }
      }
    },
    "/mcp/docs": {
      "post": {
        "operationId": "callMcpDocs",
        "summary": "Call the documentation MCP surface",
        "description": "Compatibility endpoint for the same public read-only MCP transport, scoped to documentation resources.",
        "parameters": [{ "$ref": "#/components/parameters/IdempotencyKey" }],
        "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/McpRequest" } } } },
        "responses": { "200": { "description": "MCP JSON-RPC response", "content": { "application/json": { "schema": { "type": "object", "required": ["jsonrpc"], "properties": { "jsonrpc": { "const": "2.0" }, "id": {}, "result": {}, "error": { "type": "object" } }, "additionalProperties": true } } } } }
      }
    },
    "/mcp/product": {
      "get": {
        "operationId": "getProductMcpInfo",
        "summary": "Read product MCP transport information",
        "description": "Returns public capabilities for the stateless, read-only product MCP surface that reports aggregate page-view totals.",
        "responses": { "200": { "description": "Product MCP server information", "content": { "application/json": { "schema": { "type": "object", "required": ["protocolVersion", "serverInfo", "capabilities"], "properties": { "protocolVersion": { "type": "string" }, "serverInfo": { "type": "object" }, "capabilities": { "type": "object" }, "endpoint": { "type": "string", "format": "uri" } }, "additionalProperties": true } } } } }
      },
      "post": {
        "operationId": "callProductMcp",
        "summary": "Call the read-only page counter MCP server",
        "description": "Accepts MCP JSON-RPC requests for reading aggregate page-view totals without incrementing them.",
        "parameters": [{ "$ref": "#/components/parameters/IdempotencyKey" }],
        "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/McpRequest" } } } },
        "responses": { "200": { "description": "Product MCP JSON-RPC response", "content": { "application/json": { "schema": { "type": "object", "required": ["jsonrpc"], "properties": { "jsonrpc": { "const": "2.0" }, "id": {}, "result": {}, "error": { "type": "object" } }, "additionalProperties": true } } } } }
      }
    },
    "/a2a": {
      "get": {
        "operationId": "getA2AInfo",
        "summary": "Read A2A endpoint information",
        "description": "Returns the public Agent Card URL for the read-only A2A interface.",
        "responses": { "200": { "description": "A2A endpoint information", "content": { "application/json": { "schema": { "type": "object", "required": ["jsonrpc"], "properties": { "jsonrpc": { "const": "2.0" }, "id": {}, "result": {}, "error": { "type": "object" } }, "additionalProperties": true } } } } }
      },
      "post": {
        "operationId": "sendA2AMessage",
        "summary": "Send a read-only A2A message",
        "description": "Accepts a JSON-RPC message/send request and returns links from the curated archive index.",
        "parameters": [{ "$ref": "#/components/parameters/IdempotencyKey" }],
        "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/A2ARequest" } } } },
        "responses": { "200": { "description": "A2A JSON-RPC response", "content": { "application/json": { "schema": { "type": "object", "required": ["jsonrpc"], "properties": { "jsonrpc": { "const": "2.0" }, "id": {}, "result": {}, "error": { "type": "object" } }, "additionalProperties": true } } } } }
      }
    },
    "/a2ui": {
      "get": {
        "operationId": "getA2uiArchiveSurface",
        "summary": "Read a declarative A2UI archive surface",
        "description": "Returns a small read-only A2UI v1.0 surface describing the public archive viewer.",
        "responses": {
          "200": {
            "description": "A2UI v1.0 surface message",
            "content": { "application/json": { "schema": { "type": "object", "required": ["version", "createSurface"], "properties": { "version": { "type": "string", "const": "v1.0" }, "createSurface": { "type": "object", "required": ["surfaceId", "catalogId", "components"], "properties": { "surfaceId": { "type": "string" }, "catalogId": { "type": "string", "format": "uri" }, "components": { "type": "array", "items": { "type": "object" } } }, "additionalProperties": true } }, "additionalProperties": false } } }
          }
        }
      },
      "post": {
        "operationId": "postA2uiArchiveSurface",
        "summary": "Request the read-only A2UI archive surface",
        "description": "Returns the same read-only A2UI v1.0 archive surface without changing site data.",
        "parameters": [{ "$ref": "#/components/parameters/IdempotencyKey" }],
        "responses": {
          "200": {
            "description": "A2UI v1.0 surface message",
            "content": { "application/json": { "schema": { "type": "object", "required": ["version", "createSurface"], "properties": { "version": { "type": "string", "const": "v1.0" }, "createSurface": { "type": "object", "required": ["surfaceId", "catalogId", "components"], "properties": { "surfaceId": { "type": "string" }, "catalogId": { "type": "string", "format": "uri" }, "components": { "type": "array", "items": { "type": "object" } } }, "additionalProperties": true } }, "additionalProperties": false } } }
          }
        }
      }
    },
    "/.well-known/agent-card.json": {
      "get": {
        "operationId": "getA2AAgentCard",
        "summary": "Read the A2A Agent Card",
        "description": "Returns the public, read-only A2A discovery card.",
        "responses": { "200": { "description": "A2A Agent Card", "content": { "application/a2a+json": { "schema": { "type": "object" } }, "application/json": { "schema": { "type": "object" } } } } }
      }
    }
  },
  "components": {
    "parameters": {
      "IdempotencyKey": {
        "name": "Idempotency-Key",
        "in": "header",
        "required": false,
        "description": "Optional client retry token. These POST operations are read-only, so repeating a request with the same key is safe and has no duplicate side effect.",
        "schema": { "type": "string", "minLength": 1, "maxLength": 200 }
      }
    },
    "schemas": {
      "ProblemDetails": {
        "type": "object",
        "required": ["type", "title", "status", "detail"],
        "properties": {
          "type": { "type": "string", "format": "uri" },
          "title": { "type": "string" },
          "status": { "type": "integer", "minimum": 400, "maximum": 599 },
          "detail": { "type": "string" },
          "code": { "type": "string" },
          "resolution": { "type": "string" },
          "documentation": { "type": "string", "format": "uri" },
          "instance": { "type": "string", "format": "uri" }
        },
        "additionalProperties": true
      },
      "Error": {
        "type": "object",
        "required": ["error"],
        "properties": {
          "error": { "type": "object", "required": ["code", "message"], "properties": { "code": { "type": "string" }, "message": { "type": "string" } }, "additionalProperties": false },
          "type": { "type": "string", "format": "uri" },
          "title": { "type": "string" },
          "status": { "type": "integer", "minimum": 400, "maximum": 599 },
          "detail": { "type": "string" },
          "code": { "type": "string" },
          "instance": { "type": "string", "format": "uri" },
          "resolution": { "type": "string" },
          "documentation": { "type": "string", "format": "uri" },
          "retryAfterSeconds": { "type": "integer", "minimum": 1 }
        },
        "additionalProperties": false
      },
      "AskRequest": {
        "type": "object",
        "required": ["query"],
        "properties": {
          "query": { "oneOf": [{ "type": "string" }, { "type": "object", "required": ["text"], "properties": { "text": { "type": "string" } }, "additionalProperties": false }] },
          "mode": { "type": "string", "enum": ["list", "summarize", "generate"], "default": "list" },
          "streaming": { "type": "boolean", "default": false },
          "query_id": { "type": "string" }
          ,"limit": { "type": "integer", "minimum": 1, "maximum": 12, "default": 8 },
          "cursor": { "type": "string" }
        },
        "additionalProperties": false
      },
      "AskResponse": {
        "type": "object",
        "required": ["_meta", "query_id", "results"],
        "properties": {
          "_meta": { "type": "object", "required": ["response_type", "version"], "properties": { "response_type": { "type": "string" }, "version": { "type": "string" }, "streaming": { "type": "boolean" } }, "additionalProperties": true },
          "query_id": { "type": "string" },
          "mode": { "type": "string" },
          "summary": { "type": "string" },
          "results": { "type": "array", "items": { "$ref": "#/components/schemas/ArchiveSearchResult" } },
          "pagination": { "$ref": "#/components/schemas/Pagination" }
        },
        "additionalProperties": false
      },
      "ArchiveSearchResult": {
        "type": "object",
        "required": ["url", "name", "site", "score", "description"],
        "properties": { "url": { "type": "string", "format": "uri" }, "name": { "type": "string" }, "site": { "type": "string", "format": "uri" }, "score": { "type": "number" }, "description": { "type": "string" }, "schema_object": { "type": "object" } },
        "additionalProperties": false
      },
      "Pagination": {
        "type": "object",
        "required": ["limit", "hasMore"],
        "properties": { "limit": { "type": "integer", "minimum": 1 }, "nextCursor": { "type": ["string", "null"] }, "hasMore": { "type": "boolean" } },
        "additionalProperties": false
      },
      "BatchRequest": {
        "type": "object",
        "required": ["paths"],
        "properties": { "paths": { "type": "array", "minItems": 1, "maxItems": 8, "items": { "type": "string", "format": "uri" } } },
        "additionalProperties": false
      },
      "BatchResponse": {
        "type": "object",
        "required": ["readOnly", "count", "results"],
        "properties": { "readOnly": { "const": true }, "count": { "type": "integer", "minimum": 1, "maximum": 8 }, "results": { "type": "array", "items": { "type": "object", "required": ["url", "status", "contentType"], "properties": { "url": { "type": "string", "format": "uri" }, "status": { "type": "integer" }, "contentType": { "type": "string" }, "content": { "type": ["string", "null"] } }, "additionalProperties": false } } },
        "additionalProperties": false
      },
      "McpRequest": {
        "type": "object",
        "required": ["jsonrpc", "method"],
        "properties": { "jsonrpc": { "const": "2.0" }, "id": { "oneOf": [{ "type": "string" }, { "type": "integer" }, { "type": "null" }] }, "method": { "type": "string" }, "params": { "type": "object" } },
        "additionalProperties": true
      },
      "McpResponse": {
        "type": "object",
        "required": ["jsonrpc"],
        "properties": { "jsonrpc": { "const": "2.0" }, "id": {}, "result": {}, "error": { "type": "object" } },
        "additionalProperties": true
      },
      "McpServerInfo": {
        "type": "object",
        "required": ["protocolVersion", "serverInfo", "capabilities"],
        "properties": { "protocolVersion": { "type": "string" }, "serverInfo": { "type": "object" }, "capabilities": { "type": "object" }, "endpoint": { "type": "string", "format": "uri" } },
        "additionalProperties": true
      },
      "A2ARequest": {
        "type": "object",
        "required": ["jsonrpc", "method"],
        "properties": { "jsonrpc": { "const": "2.0" }, "id": {}, "method": { "type": "string", "enum": ["message/send", "tasks/send", "agent/card"] }, "params": { "type": "object" } },
        "additionalProperties": true
      },
      "A2AResponse": {
        "type": "object",
        "required": ["jsonrpc"],
        "properties": { "jsonrpc": { "const": "2.0" }, "id": {}, "result": {}, "error": { "type": "object" } },
        "additionalProperties": true
      },
      "A2uiMessage": {
        "type": "object",
        "required": ["version", "createSurface"],
        "properties": {
          "version": { "type": "string", "const": "v1.0" },
          "createSurface": { "type": "object", "required": ["surfaceId", "catalogId", "components"], "properties": { "surfaceId": { "type": "string" }, "catalogId": { "type": "string", "format": "uri" }, "components": { "type": "array", "items": { "type": "object" } } }, "additionalProperties": true }
        },
        "additionalProperties": false
      }
    }
  }
}
