89 lines
2.7 KiB
Python
89 lines
2.7 KiB
Python
"""Intermediate Representation (IR) models for OpenAPI operations."""
|
|
|
|
from typing import Any, Literal
|
|
|
|
from pydantic import Field
|
|
|
|
from fastmcp.utilities.types import FastMCPBaseModel
|
|
|
|
# Type definitions
|
|
HttpMethod = Literal[
|
|
"GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS", "HEAD", "TRACE"
|
|
]
|
|
ParameterLocation = Literal["path", "query", "header", "cookie"]
|
|
JsonSchema = dict[str, Any]
|
|
|
|
|
|
class ParameterInfo(FastMCPBaseModel):
|
|
"""Represents a single parameter for an HTTP operation in our IR."""
|
|
|
|
name: str
|
|
location: ParameterLocation # Mapped from 'in' field of openapi-pydantic Parameter
|
|
required: bool = False
|
|
schema_: JsonSchema = Field(..., alias="schema") # Target name in IR
|
|
description: str | None = None
|
|
explode: bool | None = None # OpenAPI explode property for array parameters
|
|
style: str | None = None # OpenAPI style property for parameter serialization
|
|
|
|
|
|
class RequestBodyInfo(FastMCPBaseModel):
|
|
"""Represents the request body for an HTTP operation in our IR."""
|
|
|
|
required: bool = False
|
|
content_schema: dict[str, JsonSchema] = Field(
|
|
default_factory=dict
|
|
) # Key: media type
|
|
description: str | None = None
|
|
|
|
|
|
class ResponseInfo(FastMCPBaseModel):
|
|
"""Represents response information in our IR."""
|
|
|
|
description: str | None = None
|
|
# Store schema per media type, key is media type
|
|
content_schema: dict[str, JsonSchema] = Field(default_factory=dict)
|
|
|
|
|
|
class HTTPRoute(FastMCPBaseModel):
|
|
"""Intermediate Representation for a single OpenAPI operation."""
|
|
|
|
path: str
|
|
method: HttpMethod
|
|
operation_id: str | None = None
|
|
summary: str | None = None
|
|
description: str | None = None
|
|
tags: list[str] = Field(default_factory=list)
|
|
parameters: list[ParameterInfo] = Field(default_factory=list)
|
|
request_body: RequestBodyInfo | None = None
|
|
responses: dict[str, ResponseInfo] = Field(
|
|
default_factory=dict
|
|
) # Key: status code str
|
|
request_schemas: dict[str, JsonSchema] = Field(
|
|
default_factory=dict
|
|
) # Store schemas needed for input (parameters/request body)
|
|
response_schemas: dict[str, JsonSchema] = Field(
|
|
default_factory=dict
|
|
) # Store schemas needed for output (responses)
|
|
extensions: dict[str, Any] = Field(default_factory=dict)
|
|
openapi_version: str | None = None
|
|
|
|
# Pre-calculated fields for performance
|
|
flat_param_schema: JsonSchema = Field(
|
|
default_factory=dict
|
|
) # Combined schema for MCP tools
|
|
parameter_map: dict[str, dict[str, str]] = Field(
|
|
default_factory=dict
|
|
) # Maps flat args to locations
|
|
|
|
|
|
# Export public symbols
|
|
__all__ = [
|
|
"HTTPRoute",
|
|
"ParameterInfo",
|
|
"RequestBodyInfo",
|
|
"ResponseInfo",
|
|
"HttpMethod",
|
|
"ParameterLocation",
|
|
"JsonSchema",
|
|
]
|