{
  "openapi": "3.1.0",
  "info": {
    "title": "agent-manager reference API",
    "version": "1.0.0",
    "summary": "Read-only reference data about agent-manager.",
    "description": "This is the public read-only API for agent-manager's reference data: the documentation, the coding CLIs it manages, the tools its MCP server exposes, and the current release. Driving agent-manager itself happens on the developer's own machine through the MCP server that ships in the binary, not through this API.\n\n## Versioning and deprecation\n\nEvery path is available unversioned and pinned: `/api/docs` always points at the newest\nversion, `/api/v1/docs` stays on v1. A breaking change to a response shape ships under a new\n`/api/v2` prefix, never in place.\n\nEvery response carries `API-Version` with the version that produced it and `Deprecation:\nfalse`. When a version is scheduled for removal, that header becomes an IMF-fixdate per RFC\n9745 and a `Sunset` header per RFC 8594 names the date the version stops answering, at least\n180 days ahead. A `Link: rel=\"deprecation\"` on the same response points at the migration note.\n\n## Rate limits\n\nThe published budget is 600 requests per 60 seconds per caller, advertised on every response\nthrough `RateLimit`, `RateLimit-Policy`, `RateLimit-Limit`, `RateLimit-Remaining` and\n`RateLimit-Reset`. A throttled request answers `429` with `Retry-After`.\n\n## Authentication\n\nNone. Every endpoint is public and read-only; see /auth.md.",
    "license": {
      "name": "Apache-2.0",
      "url": "https://www.apache.org/licenses/LICENSE-2.0"
    },
    "contact": {
      "name": "agent-manager issues",
      "url": "https://github.com/YoanWai/agent-manager/issues"
    }
  },
  "servers": [
    {
      "url": "https://agent-manager.dev",
      "description": "Production, newest version"
    },
    {
      "url": "https://agent-manager.dev/api/v1",
      "description": "Production, pinned to v1"
    }
  ],
  "security": [],
  "externalDocs": {
    "description": "Documentation",
    "url": "https://agent-manager.dev/docs/"
  },
  "tags": [
    {
      "name": "meta",
      "description": "What this API offers."
    },
    {
      "name": "docs",
      "description": "The documentation, as data and as Markdown."
    },
    {
      "name": "product",
      "description": "The CLIs agent-manager manages and the tools it exposes."
    },
    {
      "name": "releases",
      "description": "The current release and how to install it."
    }
  ],
  "paths": {
    "/api": {
      "get": {
        "operationId": "getApiIndex",
        "tags": [
          "meta"
        ],
        "summary": "Index of this API",
        "description": "Lists every endpoint on this API with its path and purpose, plus the machine-readable files and the MCP endpoint this site publishes. Start here when discovering the API.",
        "parameters": [
          {
            "name": "tag",
            "in": "query",
            "required": false,
            "description": "Return only the endpoints in this tag: meta, docs, product or releases.",
            "schema": {
              "type": "string",
              "enum": [
                "meta",
                "docs",
                "product",
                "releases"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The endpoint index.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "name",
                    "version",
                    "endpoints"
                  ],
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "version": {
                      "type": "string"
                    },
                    "description": {
                      "type": "string"
                    },
                    "documentation_url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "openapi_url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "llms_txt_url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "mcp": {
                      "type": "object",
                      "description": "The Streamable HTTP MCP endpoint this site serves.",
                      "properties": {
                        "endpoint": {
                          "type": "string",
                          "format": "uri"
                        },
                        "transport": {
                          "type": "string"
                        },
                        "server_card_url": {
                          "type": "string",
                          "format": "uri"
                        }
                      }
                    },
                    "endpoints": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "path",
                          "method",
                          "operation_id",
                          "summary"
                        ],
                        "properties": {
                          "path": {
                            "type": "string"
                          },
                          "method": {
                            "type": "string"
                          },
                          "operation_id": {
                            "type": "string"
                          },
                          "summary": {
                            "type": "string"
                          },
                          "tags": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "The path exists but not for that HTTP method.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "406": {
            "description": "No representation matches the request's Accept header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/docs": {
      "get": {
        "operationId": "listDocPages",
        "tags": [
          "docs"
        ],
        "summary": "List every page on this site",
        "description": "Returns the title, description, section, canonical URL and Markdown URL of every page agent-manager.dev publishes. Use the returned slug with getDocPage to read one.",
        "parameters": [
          {
            "name": "section",
            "in": "query",
            "required": false,
            "description": "Return only pages in this section, such as Documentation.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "The next_cursor from the previous response. Cursor-based, so a page added mid-walk cannot shift the window.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "How many pages to return in this window.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 100
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Every page, newest structure first.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "count",
                    "total",
                    "pages"
                  ],
                  "properties": {
                    "count": {
                      "type": "integer",
                      "description": "Pages in this window."
                    },
                    "total": {
                      "type": "integer",
                      "description": "Pages matching the filter."
                    },
                    "next_cursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Pass back as cursor for the next window; null when this is the last one."
                    },
                    "sections": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "pages": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/PageSummary"
                      }
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "The path exists but not for that HTTP method.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "406": {
            "description": "No representation matches the request's Accept header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/docs/{slug}": {
      "get": {
        "operationId": "getDocPage",
        "tags": [
          "docs"
        ],
        "summary": "Read one page as Markdown",
        "description": "Returns one page's metadata together with its full body as Markdown, with the site chrome removed. The slug is the one listDocPages returns and may contain slashes.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Page slug from listDocPages, for example install or writing/live-review-race.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The page and its Markdown body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "slug",
                    "title",
                    "url",
                    "markdown_url",
                    "section",
                    "markdown"
                  ],
                  "properties": {
                    "slug": {
                      "type": "string",
                      "description": "Identifier for getDocPage."
                    },
                    "title": {
                      "type": "string"
                    },
                    "description": {
                      "type": "string"
                    },
                    "section": {
                      "type": "string",
                      "description": "Documentation, Writing, or Site."
                    },
                    "url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Canonical HTML URL."
                    },
                    "markdown_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Same page as Markdown; the HTML URL also serves it under Accept: text/markdown."
                    },
                    "markdown": {
                      "type": "string",
                      "description": "The page body as Markdown."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "No resource exists at that path.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "The path exists but not for that HTTP method.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "406": {
            "description": "No representation matches the request's Accept header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/agents": {
      "get": {
        "operationId": "listSupportedAgents",
        "tags": [
          "product"
        ],
        "summary": "Coding CLIs with built-in status detection",
        "description": "The coding CLIs agent-manager ships a working profile for: the command it runs, where its live status comes from, and how it resumes a conversation. Any other CLI is added with one TOML block.",
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "required": false,
            "description": "Return only this profile, by its config.toml key, such as claude or codex.",
            "schema": {
              "type": "string",
              "enum": [
                "claude",
                "codex",
                "opencode",
                "grok",
                "gemini",
                "pi",
                "command-code",
                "hermes"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The built-in agent profiles.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "count",
                    "agents"
                  ],
                  "properties": {
                    "count": {
                      "type": "integer"
                    },
                    "note": {
                      "type": "string"
                    },
                    "agents": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Agent"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "A parameter is missing or out of range.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "The path exists but not for that HTTP method.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "406": {
            "description": "No representation matches the request's Accept header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/mcp/tools": {
      "get": {
        "operationId": "listMcpTools",
        "tags": [
          "product"
        ],
        "summary": "Tools the agent-manager MCP server exposes",
        "description": "The tools the MCP server inside the agent-manager binary registers into every MCP-capable session it starts, grouped by what they act on. These run on the developer's machine, not here.",
        "parameters": [
          {
            "name": "group",
            "in": "query",
            "required": false,
            "description": "Return only the tools that act on this part of the workspace.",
            "schema": {
              "type": "string",
              "enum": [
                "coordination",
                "groups",
                "review",
                "session",
                "terminals"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The MCP tool catalogue.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "count",
                    "tools"
                  ],
                  "properties": {
                    "count": {
                      "type": "integer"
                    },
                    "transport": {
                      "type": "string",
                      "description": "How these tools are reached: stdio, inside the binary."
                    },
                    "note": {
                      "type": "string"
                    },
                    "tools": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/McpTool"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "A parameter is missing or out of range.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "The path exists but not for that HTTP method.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "406": {
            "description": "No representation matches the request's Accept header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/release": {
      "get": {
        "operationId": "getLatestRelease",
        "tags": [
          "releases"
        ],
        "summary": "Latest release and install commands",
        "description": "The newest published release, read live from the project's GitHub releases, together with the install command for every package manager the project supports.",
        "parameters": [
          {
            "name": "install_method",
            "in": "query",
            "required": false,
            "description": "Return the install command for this package manager only.",
            "schema": {
              "type": "string",
              "enum": [
                "homebrew",
                "script",
                "aur",
                "mise",
                "go"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The current release.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "version",
                    "url",
                    "install"
                  ],
                  "properties": {
                    "version": {
                      "type": "string",
                      "description": "Tag of the newest release."
                    },
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "published_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "install": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "id",
                          "name",
                          "command"
                        ],
                        "properties": {
                          "id": {
                            "type": "string"
                          },
                          "name": {
                            "type": "string"
                          },
                          "command": {
                            "type": "string"
                          },
                          "platforms": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "A parameter is missing or out of range.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A source this endpoint reads from could not be reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "The path exists but not for that HTTP method.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "406": {
            "description": "No representation matches the request's Accept header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/batch": {
      "post": {
        "operationId": "runBatch",
        "tags": [
          "meta"
        ],
        "summary": "Run several read operations in one request",
        "description": "Takes an array of read operations and returns one result per entry, in order, so an agent that needs several pages pays one round trip instead of one per page. Each entry is answered independently: one failing does not fail the batch. Every operation is a read, so replaying the same request is always safe.",
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional key echoed back on the response so a retried request can be matched with its original. Nothing is deduplicated server-side because every operation reads.",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "operations"
                ],
                "properties": {
                  "operations": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 20,
                    "items": {
                      "type": "object",
                      "required": [
                        "op"
                      ],
                      "properties": {
                        "id": {
                          "type": "string",
                          "description": "Echoed back on the result."
                        },
                        "op": {
                          "type": "string",
                          "enum": [
                            "get_doc_page",
                            "search_docs",
                            "list_doc_pages",
                            "list_agents",
                            "list_mcp_tools"
                          ]
                        },
                        "slug": {
                          "type": "string",
                          "description": "For get_doc_page."
                        },
                        "query": {
                          "type": "string",
                          "description": "For search_docs."
                        },
                        "limit": {
                          "type": "integer",
                          "description": "For search_docs."
                        },
                        "section": {
                          "type": "string",
                          "description": "For list_doc_pages."
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "One result per operation.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "count",
                    "results"
                  ],
                  "properties": {
                    "count": {
                      "type": "integer"
                    },
                    "succeeded": {
                      "type": "integer"
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "op",
                          "status"
                        ],
                        "properties": {
                          "id": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "op": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "status": {
                            "type": "string",
                            "enum": [
                              "ok",
                              "error"
                            ]
                          },
                          "result": {
                            "type": "object",
                            "description": "Present when status is ok."
                          },
                          "error": {
                            "type": "object",
                            "description": "Present when status is error."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "A parameter is missing or out of range.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "The path exists but not for that HTTP method.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "406": {
            "description": "No representation matches the request's Accept header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/ask": {
      "post": {
        "operationId": "askNaturalLanguage",
        "tags": [
          "docs"
        ],
        "summary": "Ask a question in natural language (NLWeb)",
        "description": "An NLWeb-shaped endpoint: takes a natural-language query and returns ranked pages with schema.org objects. Send Accept: text/event-stream, or streaming true, for an SSE stream of start, result and complete events.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "query"
                ],
                "properties": {
                  "query": {
                    "type": "string",
                    "minLength": 1,
                    "description": "The question, in natural language."
                  },
                  "mode": {
                    "type": "string",
                    "enum": [
                      "list",
                      "summarize",
                      "generate"
                    ],
                    "default": "list"
                  },
                  "site": {
                    "type": "string",
                    "description": "Scope token; this host serves one site."
                  },
                  "query_id": {
                    "type": "string",
                    "description": "Echoed back; generated when absent."
                  },
                  "streaming": {
                    "type": "boolean",
                    "description": "Ask for SSE instead of JSON."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Ranked results for the query.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "query_id",
                    "results"
                  ],
                  "properties": {
                    "query_id": {
                      "type": "string"
                    },
                    "query": {
                      "type": "string"
                    },
                    "mode": {
                      "type": "string"
                    },
                    "summary": {
                      "type": "string"
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "url",
                          "name"
                        ],
                        "properties": {
                          "url": {
                            "type": "string",
                            "format": "uri"
                          },
                          "name": {
                            "type": "string"
                          },
                          "site": {
                            "type": "string"
                          },
                          "score": {
                            "type": "number"
                          },
                          "description": {
                            "type": "string"
                          },
                          "schema_object": {
                            "type": "object"
                          }
                        }
                      }
                    },
                    "_meta": {
                      "type": "object",
                      "properties": {
                        "response_type": {
                          "type": "string"
                        },
                        "version": {
                          "type": "string"
                        },
                        "site": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "A parameter is missing or out of range.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "The path exists but not for that HTTP method.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "406": {
            "description": "No representation matches the request's Accept header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/search": {
      "get": {
        "operationId": "searchDocs",
        "tags": [
          "docs"
        ],
        "summary": "Search the documentation",
        "description": "Case-insensitive search over every page's title, description and section. Returns the same page summaries as listDocPages, best match first.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "description": "What to search for.",
            "schema": {
              "type": "string",
              "minLength": 1
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "How many results to return.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 10
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Matching pages.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "query",
                    "count",
                    "results"
                  ],
                  "properties": {
                    "query": {
                      "type": "string"
                    },
                    "count": {
                      "type": "integer"
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/SearchResult"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "A parameter is missing or out of range.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "The path exists but not for that HTTP method.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "406": {
            "description": "No representation matches the request's Accept header.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "description": "Every failing response on this API has this shape.",
        "properties": {
          "error": {
            "type": "object",
            "required": [
              "code",
              "message",
              "status"
            ],
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "invalid_request",
                  "not_found",
                  "method_not_allowed",
                  "not_acceptable",
                  "upstream_unavailable"
                ],
                "description": "Stable machine-readable error code."
              },
              "message": {
                "type": "string",
                "description": "What went wrong, in one sentence."
              },
              "status": {
                "type": "integer",
                "description": "The HTTP status of this response."
              },
              "hint": {
                "type": "string",
                "description": "What to try instead."
              },
              "documentation_url": {
                "type": "string",
                "format": "uri",
                "description": "Where this endpoint is documented."
              }
            }
          }
        }
      },
      "PageSummary": {
        "type": "object",
        "required": [
          "slug",
          "title",
          "url",
          "markdown_url",
          "section"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Identifier for getDocPage."
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "section": {
            "type": "string",
            "description": "Documentation, Writing, or Site."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Canonical HTML URL."
          },
          "markdown_url": {
            "type": "string",
            "format": "uri",
            "description": "Same page as Markdown; the HTML URL also serves it under Accept: text/markdown."
          }
        }
      },
      "SearchResult": {
        "type": "object",
        "required": [
          "slug",
          "title",
          "url",
          "markdown_url",
          "section"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Identifier for getDocPage."
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "section": {
            "type": "string",
            "description": "Documentation, Writing, or Site."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Canonical HTML URL."
          },
          "markdown_url": {
            "type": "string",
            "format": "uri",
            "description": "Same page as Markdown; the HTML URL also serves it under Accept: text/markdown."
          },
          "snippet": {
            "type": "string",
            "description": "The matching line of the page, when the match was in the body rather than the title."
          }
        }
      },
      "Agent": {
        "type": "object",
        "required": [
          "id",
          "name",
          "command"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "The [tools.<id>] key in config.toml."
          },
          "name": {
            "type": "string"
          },
          "command": {
            "type": "string",
            "description": "The command the session runs."
          },
          "status_source": {
            "type": "string",
            "description": "Where the row's live status comes from."
          },
          "resume": {
            "type": "string",
            "description": "How a conversation is resumed or forked."
          }
        }
      },
      "McpTool": {
        "type": "object",
        "required": [
          "name",
          "summary"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "group": {
            "type": "string",
            "description": "What the tool acts on: session, review, coordination, groups or terminals."
          },
          "summary": {
            "type": "string"
          }
        }
      }
    }
  }
}
