oas2mcp.models.normalized

Normalized OpenAPI models.

Purpose:

Define stable, typed Pydantic models for the normalized internal view of an OpenAPI specification.

Design:
  • Flatten OpenAPI structures into reusable, agent-friendly models.

  • Preserve enough metadata for Rich rendering, inspection, and later MCP generation.

  • Use clean internal field names instead of OpenAPI alias names where the alias would be awkward or invalid in Python, such as in.

  • Keep raw fragments available for debugging and future enrichment.

Examples

from oas2mcp.models.normalized import ApiCatalog, ApiOperation

operation = ApiOperation(
    method="get",
    path="/pets/{petId}",
    operation_id="getPetById",
    summary="Fetch one pet",
)

catalog = ApiCatalog(
    name="Petstore",
    source_uri="https://petstore3.swagger.io/api/v3/openapi.json",
    operations=[operation],
)

Attributes

Classes

ApiCatalog

Top-level normalized API catalog.

ApiContact

Contact metadata for an API.

ApiInfo

Top-level API metadata.

ApiLicense

License metadata for an API.

ApiMediaType

Normalized media type description.

ApiOperation

One normalized HTTP operation.

ApiParameter

Normalized operation parameter.

ApiPathItem

Normalized path item grouping multiple operations.

ApiRequestBody

Normalized request body definition.

ApiResponse

Normalized response definition.

ApiSecurityRequirement

One normalized security requirement mapping.

ApiSecurityScheme

One named security scheme.

ApiServer

Resolved server definition.

ApiTag

Normalized tag metadata.

NormalizedBaseModel

Base model for normalized OpenAPI objects.

Module Contents

class oas2mcp.models.normalized.ApiCatalog(/, **data: Any)[source][source]

Bases: NormalizedBaseModel

Top-level normalized API catalog.

Parameters:

None.

Returns:

None.

Raises:

None.

Examples

catalog = ApiCatalog(
    name="Petstore",
    source_uri="https://example.com/openapi.json",
)
component_counts: dict[str, int] = None[source][source]
global_security: list[ApiSecurityRequirement] = None[source][source]
info: ApiInfo | None = None[source][source]
name: str[source][source]
openapi_version: str | None = None[source][source]
property operation_count: int[source][source]

Return the number of normalized operations.

Parameters:

None.

Returns:

The number of operations in the catalog.

Raises:

None.

Examples

catalog = ApiCatalog(
    name="Petstore",
    source_uri="https://example.com/openapi.json",
)
assert catalog.operation_count == 0
operations: list[ApiOperation] = None[source][source]
paths: list[ApiPathItem] = None[source][source]
raw_spec: dict[str, Any] = None[source][source]
security_schemes: list[ApiSecurityScheme] = None[source][source]
servers: list[ApiServer] = None[source][source]
source_uri: str[source][source]
property tag_names: list[str][source][source]

Return all tag names.

Parameters:

None.

Returns:

A list of tag names.

Raises:

None.

Examples

catalog = ApiCatalog(
    name="Petstore",
    source_uri="https://example.com/openapi.json",
)
assert catalog.tag_names == []
tags: list[ApiTag] = None[source][source]
class oas2mcp.models.normalized.ApiContact(/, **data: Any)[source][source]

Bases: NormalizedBaseModel

Contact metadata for an API.

Parameters:

None.

Returns:

None.

Raises:

None.

Examples

contact = ApiContact(
    name="API Support",
    email="support@example.com",
    url="https://example.com/support",
)
email: str | None = None[source][source]
name: str | None = None[source][source]
url: str | None = None[source][source]
class oas2mcp.models.normalized.ApiInfo(/, **data: Any)[source][source]

Bases: NormalizedBaseModel

Top-level API metadata.

Parameters:

None.

Returns:

None.

Raises:

None.

Examples

info = ApiInfo(
    title="Petstore",
    version="1.0.0",
    summary="Pet operations",
)
contact: ApiContact | None = None[source][source]
description: str | None = None[source][source]
license: ApiLicense | None = None[source][source]
summary: str | None = None[source][source]
terms_of_service: str | None = None[source][source]
title: str[source][source]
version: str[source][source]
class oas2mcp.models.normalized.ApiLicense(/, **data: Any)[source][source]

Bases: NormalizedBaseModel

License metadata for an API.

Parameters:

None.

Returns:

None.

Raises:

None.

Examples

license_info = ApiLicense(name="MIT")
identifier: str | None = None[source][source]
name: str[source][source]
url: str | None = None[source][source]
class oas2mcp.models.normalized.ApiMediaType(/, **data: Any)[source][source]

Bases: NormalizedBaseModel

Normalized media type description.

Parameters:

None.

Returns:

None.

Raises:

None.

Examples

media = ApiMediaType(
    content_type="application/json",
    schema_type="object",
)
content_type: str[source][source]
example: Any | None = None[source][source]
examples: dict[str, Any] = None[source][source]
raw_schema: dict[str, Any] = None[source][source]
schema_ref: str | None = None[source][source]
schema_type: str | None = None[source][source]
class oas2mcp.models.normalized.ApiOperation(/, **data: Any)[source][source]

Bases: NormalizedBaseModel

One normalized HTTP operation.

Parameters:

None.

Returns:

None.

Raises:

None.

Examples

operation = ApiOperation(
    method="get",
    path="/pets/{petId}",
    operation_id="getPetById",
)
classmethod normalize_method(value: str) str[source][source]

Normalize and validate an HTTP method.

Parameters:

value – The input HTTP method.

Returns:

The normalized uppercase HTTP method.

Raises:

ValueError – If the method is unsupported.

Examples

ApiOperation(
    method="get",
    path="/pets",
)
classmethod normalize_path(value: str) str[source][source]

Normalize a path string.

Parameters:

value – The raw path string.

Returns:

The normalized path starting with /.

Raises:

ValueError – If the path is empty.

Examples

ApiOperation(
    method="GET",
    path="pets/{petId}",
)
deprecated: bool = False[source][source]
description: str | None = None[source][source]
external_docs_description: str | None = None[source][source]
external_docs_url: str | None = None[source][source]
property is_mutating: bool[source][source]

Return whether the operation mutates remote state.

Parameters:

None.

Returns:

True for mutating HTTP methods.

Raises:

None.

Examples

operation = ApiOperation(method="POST", path="/pets")
assert operation.is_mutating is True
property key: str[source][source]

Return a stable operation lookup key.

Parameters:

None.

Returns:

A METHOD path lookup key.

Raises:

None.

Examples

operation = ApiOperation(method="GET", path="/pets")
assert operation.key == "GET /pets"
method: str[source][source]
operation_id: str | None = None[source][source]
parameters: list[ApiParameter] = None[source][source]
path: str[source][source]
raw_operation: dict[str, Any] = None[source][source]
request_body: ApiRequestBody | None = None[source][source]
responses: list[ApiResponse] = None[source][source]
security: list[ApiSecurityRequirement] = None[source][source]
summary: str | None = None[source][source]
tags: list[str] = None[source][source]
class oas2mcp.models.normalized.ApiParameter(/, **data: Any)[source][source]

Bases: NormalizedBaseModel

Normalized operation parameter.

Parameters:

None.

Returns:

None.

Raises:

None.

Examples

parameter = ApiParameter(
    name="petId",
    location="path",
    required=True,
    schema_type="integer",
)
classmethod validate_location(value: str) str[source][source]

Validate a parameter location.

Parameters:

value – The parameter location.

Returns:

The validated location.

Raises:

ValueError – If the location is unsupported.

Examples

ApiParameter(
    name="petId",
    location="path",
)
default: Any | None = None[source][source]
description: str | None = None[source][source]
enum_values: list[Any] = None[source][source]
location: str[source][source]
name: str[source][source]
raw_schema: dict[str, Any] = None[source][source]
required: bool = False[source][source]
schema_format: str | None = None[source][source]
schema_type: str | None = None[source][source]
class oas2mcp.models.normalized.ApiPathItem(/, **data: Any)[source][source]

Bases: NormalizedBaseModel

Normalized path item grouping multiple operations.

Parameters:

None.

Returns:

None.

Raises:

None.

Examples

item = ApiPathItem(
    path="/pets",
    operations=[],
)
classmethod normalize_path(value: str) str[source][source]

Normalize a path item path.

Parameters:

value – The raw path string.

Returns:

The normalized path string.

Raises:

ValueError – If the path is empty.

Examples

ApiPathItem(path="/pets")
operations: list[ApiOperation] = None[source][source]
parameters: list[ApiParameter] = None[source][source]
path: str[source][source]
class oas2mcp.models.normalized.ApiRequestBody(/, **data: Any)[source][source]

Bases: NormalizedBaseModel

Normalized request body definition.

Parameters:

None.

Returns:

None.

Raises:

None.

Examples

body = ApiRequestBody(
    required=True,
    media_types=[ApiMediaType(content_type="application/json")],
)
description: str | None = None[source][source]
media_types: list[ApiMediaType] = None[source][source]
required: bool = False[source][source]
class oas2mcp.models.normalized.ApiResponse(/, **data: Any)[source][source]

Bases: NormalizedBaseModel

Normalized response definition.

Parameters:

None.

Returns:

None.

Raises:

None.

Examples

response = ApiResponse(
    status_code="200",
    description="Success",
)
description: str | None = None[source][source]
headers: dict[str, Any] = None[source][source]
media_types: list[ApiMediaType] = None[source][source]
status_code: str[source][source]
class oas2mcp.models.normalized.ApiSecurityRequirement(/, **data: Any)[source][source]

Bases: NormalizedBaseModel

One normalized security requirement mapping.

Parameters:

None.

Returns:

None.

Raises:

None.

Examples

requirement = ApiSecurityRequirement(
    scheme_names=["bearerAuth"],
)
scheme_names: list[str] = None[source][source]
class oas2mcp.models.normalized.ApiSecurityScheme(/, **data: Any)[source][source]

Bases: NormalizedBaseModel

One named security scheme.

Design:

name is the scheme identifier from components.securitySchemes. parameter_name is the header/query/cookie parameter name used by some schemes such as API key auth.

Parameters:

None.

Returns:

None.

Raises:

None.

Examples

scheme = ApiSecurityScheme(
    name="apiKeyAuth",
    type="apiKey",
    location="header",
    parameter_name="X-API-Key",
)
bearer_format: str | None = None[source][source]
description: str | None = None[source][source]
flows: dict[str, Any] = None[source][source]
location: str | None = None[source][source]
name: str[source][source]
open_id_connect_url: str | None = None[source][source]
parameter_name: str | None = None[source][source]
scheme: str | None = None[source][source]
type: str[source][source]
class oas2mcp.models.normalized.ApiServer(/, **data: Any)[source][source]

Bases: NormalizedBaseModel

Resolved server definition.

Parameters:

None.

Returns:

None.

Raises:

None.

Examples

server = ApiServer(
    url="https://api.example.com",
    description="Production",
)
description: str | None = None[source][source]
url: str[source][source]
variables: dict[str, dict[str, Any]] = None[source][source]
class oas2mcp.models.normalized.ApiTag(/, **data: Any)[source][source]

Bases: NormalizedBaseModel

Normalized tag metadata.

Parameters:

None.

Returns:

None.

Raises:

None.

Examples

tag = ApiTag(
    name="pets",
    description="Operations about pets.",
)
description: str | None = None[source][source]
external_docs_description: str | None = None[source][source]
external_docs_url: str | None = None[source][source]
name: str[source][source]
class oas2mcp.models.normalized.NormalizedBaseModel(/, **data: Any)[source][source]

Bases: pydantic.BaseModel

Base model for normalized OpenAPI objects.

Parameters:

None.

Returns:

None.

Raises:

None.

Examples

class ExampleModel(NormalizedBaseModel):
    name: str
model_config[source][source]

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

oas2mcp.models.normalized.HTTP_METHODS: tuple[str, Ellipsis] = ('GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS', 'HEAD', 'TRACE')[source][source]