{
  "openapi": "3.0.0",
  "info": {
    "title": "keenable-backend",
    "version": "1.0.2",
    "description": "Keenable API server"
  },
  "paths": {
    "/mcp": {
      "post": {
        "operationId": "post_mcp",
        "tags": [
          "mcp"
        ],
        "summary": "POST /mcp",
        "parameters": [],
        "responses": {
          "200": {
            "description": "HTTP 200"
          }
        }
      },
      "get": {
        "operationId": "get_mcp",
        "tags": [
          "mcp"
        ],
        "summary": "GET /mcp",
        "parameters": [],
        "responses": {
          "400": {
            "description": "HTTP 400",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "jsonrpc": {
                      "type": "string"
                    },
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "number"
                        },
                        "message": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "code",
                        "message"
                      ]
                    },
                    "id": {
                      "nullable": true
                    }
                  },
                  "required": [
                    "jsonrpc",
                    "error",
                    "id"
                  ]
                }
              }
            }
          },
          "404": {
            "description": "HTTP 404",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "jsonrpc": {
                      "type": "string"
                    },
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "number"
                        },
                        "message": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "code",
                        "message"
                      ]
                    },
                    "id": {
                      "nullable": true
                    }
                  },
                  "required": [
                    "jsonrpc",
                    "error",
                    "id"
                  ]
                }
              }
            }
          },
          "500": {
            "description": "HTTP 500",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "delete_mcp",
        "tags": [
          "mcp"
        ],
        "summary": "DELETE /mcp",
        "parameters": [],
        "responses": {
          "200": {
            "description": "HTTP 200",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "jsonrpc": {
                      "type": "string"
                    },
                    "result": {},
                    "id": {
                      "nullable": true
                    }
                  },
                  "required": [
                    "jsonrpc",
                    "result",
                    "id"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "HTTP 400",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "jsonrpc": {
                      "type": "string"
                    },
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "number"
                        },
                        "message": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "code",
                        "message"
                      ]
                    },
                    "id": {
                      "nullable": true
                    }
                  },
                  "required": [
                    "jsonrpc",
                    "error",
                    "id"
                  ]
                }
              }
            }
          },
          "500": {
            "description": "HTTP 500",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/v1/auth/user": {
      "get": {
        "operationId": "get_v1_auth_user",
        "tags": [
          "v1"
        ],
        "summary": "GET /v1/auth/user",
        "parameters": [],
        "responses": {
          "200": {
            "description": "HTTP 200",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiKeyIdentityResponseDTO"
                }
              }
            }
          },
          "401": {
            "description": "HTTP 401",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "message"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/v1/feedback": {
      "post": {
        "operationId": "post_v1_feedback",
        "tags": [
          "v1"
        ],
        "summary": "POST /v1/feedback",
        "parameters": [],
        "responses": {
          "200": {
            "description": "HTTP 200",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FeedbackResponseDTO"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FeedbackRequestDTO"
              }
            }
          }
        }
      }
    },
    "/v1/fetch": {
      "get": {
        "operationId": "get_v1_fetch",
        "tags": [
          "v1"
        ],
        "summary": "GET /v1/fetch",
        "parameters": [],
        "responses": {
          "200": {
            "description": "HTTP 200",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponseDTO"
                }
              }
            }
          },
          "400": {
            "description": "HTTP 400",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "message"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/v1/search": {
      "post": {
        "operationId": "post_v1_search",
        "tags": [
          "v1"
        ],
        "summary": "POST /v1/search",
        "parameters": [],
        "responses": {
          "200": {
            "description": "HTTP 200",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResponseDTO"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SearchRequestDTO"
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "FeedbackResponseDTO": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string"
          }
        },
        "required": [
          "message"
        ]
      },
      "FeedbackRelevanceItem": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string"
          },
          "score": {
            "type": "number"
          },
          "comment": {
            "type": "string"
          }
        },
        "required": [
          "url",
          "score",
          "comment"
        ]
      },
      "FeedbackRequestDTO": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string"
          },
          "relevance": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FeedbackRelevanceItem"
            }
          }
        },
        "required": [
          "query",
          "relevance"
        ]
      },
      "FetchResponseDTO": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string"
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "content": {
            "type": "string"
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "author": {
            "type": "string",
            "nullable": true
          },
          "published_at": {
            "type": "number",
            "nullable": true
          }
        },
        "required": [
          "url",
          "content"
        ]
      },
      "SearchResultDTO": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "snippet": {
            "type": "string",
            "nullable": true
          },
          "published_at": {
            "type": "string",
            "nullable": true
          },
          "acquired_at": {
            "type": "string",
            "nullable": true
          }
        },
        "required": [
          "title",
          "url",
          "description"
        ]
      },
      "SearchResponseDTO": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SearchResultDTO"
            }
          }
        },
        "required": [
          "query",
          "results"
        ]
      },
      "ApiKeyIdentityResponseDTO": {
        "type": "object",
        "properties": {
          "user_id": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "display_name": {
            "type": "string",
            "nullable": true
          },
          "org_id": {
            "type": "string"
          },
          "org_name": {
            "type": "string",
            "nullable": true
          }
        },
        "required": [
          "user_id",
          "email",
          "display_name",
          "org_id",
          "org_name"
        ]
      },
      "SearchRequestDTO": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string"
          },
          "acquired_after": {
            "type": "string",
            "nullable": true
          },
          "acquired_before": {
            "type": "string",
            "nullable": true
          },
          "published_after": {
            "type": "string",
            "nullable": true
          },
          "published_before": {
            "type": "string",
            "nullable": true
          },
          "site": {
            "type": "string",
            "nullable": true
          }
        },
        "required": [
          "query"
        ]
      }
    }
  }
}