> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tai42.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Skeleton app (tai42_skeleton.app)

> The concrete TaiMCP app, including the raw fastmcp escape hatch.

## logger

`tai42_skeleton.app.server.logger`

```python theme={null}
logger = logging.getLogger(__name__)
```

## TaiMCP

`tai42_skeleton.app.server.TaiMCP`

```python theme={null}
class TaiMCP(TaiMCPLifecycleMixin)
```

The concrete `tai42_contract.app.TaiApp` impl — owns the FastMCP server and
exposes the 18 contract facet namespaces as its SOLE feature/contract surface;
the concrete server additionally exposes a launch surface (`sse_app` /
`http_app` / `run` and friends) that is not part of the facade.

This class is the composition root only: each feature's impl body lives in
its feature package (`tools.binding.ToolBinding`, `agent.binding
.AgentBinding`, `backend.registry.BackendHolder`, the extension/monitoring
registries, `app.http.HttpSurface`) and each facet forwards straight to its
collaborator. Callers reach the app's features only through the facets
(`app.tools.run_tool`, `app.backends.backend`, ...) or the `tai42_app`
handle, never a flat member.

**Attributes**

| Attribute                        | Type                    |
| -------------------------------- | ----------------------- |
| `tools` *(property)*             | `ToolsFacet`            |
| `agents` *(property)*            | `AgentsFacet`           |
| `backends` *(property)*          | `BackendsFacet`         |
| `storage` *(property)*           | `StorageFacet`          |
| `connectors` *(property)*        | `ConnectorsFacet`       |
| `webhook_verifiers` *(property)* | `WebhookVerifiersFacet` |
| `channels` *(property)*          | `ChannelsFacet`         |
| `monitoring` *(property)*        | `MonitoringFacet`       |
| `extensions` *(property)*        | `ExtensionsFacet`       |
| `http` *(property)*              | `HttpFacet`             |
| `clients` *(property)*           | `ClientsFacet`          |
| `lifecycle` *(property)*         | `LifecycleFacet`        |
| `admin` *(property)*             | `AdminFacet`            |
| `config` *(property)*            | `ConfigFacet`           |
| `sub_app` *(property)*           | `SubAppFacet`           |
| `backup` *(property)*            | `BackupFacet`           |
| `versioning` *(property)*        | `VersioningFacet`       |
| `presets` *(property)*           | `PresetsFacet`          |

### Members

#### fastmcp

`tai42_skeleton.app.server.TaiMCP.fastmcp`

```python theme={null}
fastmcp: FastMCP
```

The raw, ungoverned FastMCP server — the escape hatch beneath the
facets.

Prefer the facets; reach here only for what the facets don't wrap
(prompts, resources, `add_middleware`, sampling, elicit-handlers,
completions, server metadata such as `name`/`version`/`auth`, the
process-global `fastmcp.settings`). Anything registered THROUGH this
server skips the platform's governance: manifest gating, the extension
registry's `validate()`, and the access-control gate. It is
deliberately NOT on the `tai42_contract.app.TaiApp` protocol — the
contract stays FastMCP-free so an alternative impl remains possible, so
this accessor is skeleton-specific.

Named `fastmcp` (not `mcp`) because `app.sub_app` already owns the
sub-MCP namespace; `mcp` here would read as the sub-MCP.

#### emit\_list\_changed

`tai42_skeleton.app.server.TaiMCP.emit_list_changed`

```python theme={null}
async emit_list_changed(self, kind: str) -> None
```

Broadcast a `list_changed` notification to every active MCP session
for the given SINGULAR registry `kind` (`tool` / `prompt` /
`resource`). The generic in-process registration-mutation path (e.g. a
dev's runtime `add_prompt` via `app.fastmcp`) awaits this after its
own registry mutation; the reload path drives the same registry from its
sync scheduler.

**Parameters**

| Parameter | Type  | Default | Description |
| --------- | ----- | ------- | ----------- |
| `kind`    | `str` | —       | —           |

#### sse\_app

`tai42_skeleton.app.server.TaiMCP.sse_app`

```python theme={null}
sse_app(
    self,
    path: str | None = None,
    message_path: str | None = None,
    middleware: list[Middleware] | None = None,
) -> StarletteWithLifespan
```

**Parameters**

| Parameter      | Type                       | Default | Description |
| -------------- | -------------------------- | ------- | ----------- |
| `path`         | `str \| None`              | `None`  | —           |
| `message_path` | `str \| None`              | `None`  | —           |
| `middleware`   | `list[Middleware] \| None` | `None`  | —           |

#### http\_app

`tai42_skeleton.app.server.TaiMCP.http_app`

```python theme={null}
http_app(
    self,
    path: str | None = None,
    middleware: list[Middleware] | None = None,
    json_response: bool | None = None,
    stateless_http: bool | None = None,
    transport: Literal['http', 'streamable-http', 'sse'] = 'http',
) -> StarletteWithLifespan
```

**Parameters**

| Parameter        | Type                                        | Default  | Description |
| ---------------- | ------------------------------------------- | -------- | ----------- |
| `path`           | `str \| None`                               | `None`   | —           |
| `middleware`     | `list[Middleware] \| None`                  | `None`   | —           |
| `json_response`  | `bool \| None`                              | `None`   | —           |
| `stateless_http` | `bool \| None`                              | `None`   | —           |
| `transport`      | `Literal['http', 'streamable-http', 'sse']` | `'http'` | —           |

#### run\_async

`tai42_skeleton.app.server.TaiMCP.run_async`

```python theme={null}
async run_async(
    self,
    transport: Transport | None = None,
    show_banner: bool = True,
    **transport_kwargs: Any,
) -> None
```

**Parameters**

| Parameter          | Type                | Default | Description |
| ------------------ | ------------------- | ------- | ----------- |
| `transport`        | `Transport \| None` | `None`  | —           |
| `show_banner`      | `bool`              | `True`  | —           |
| `transport_kwargs` | `Any`               | `{}`    | —           |

#### run

`tai42_skeleton.app.server.TaiMCP.run`

```python theme={null}
run(
    self,
    transport: Transport | None = None,
    show_banner: bool = True,
    **transport_kwargs: Any,
) -> None
```

**Parameters**

| Parameter          | Type                | Default | Description |
| ------------------ | ------------------- | ------- | ----------- |
| `transport`        | `Transport \| None` | `None`  | —           |
| `show_banner`      | `bool`              | `True`  | —           |
| `transport_kwargs` | `Any`               | `{}`    | —           |

#### run\_backend

`tai42_skeleton.app.server.TaiMCP.run_backend`

```python theme={null}
async run_backend(self, args) -> None
```

**Parameters**

| Parameter | Type | Default | Description |
| --------- | ---- | ------- | ----------- |
| `args`    | —    | —       | —           |

#### preset\_manager

`tai42_skeleton.app.server.TaiMCP.preset_manager`

```python theme={null}
preset_manager: PresetManager
```

The preset register/reload engine (spec map + quarantine set + register/
reload/remove/rehydrate). Skeleton-only surface — like `emit_list_changed`
and `fastmcp`, it is deliberately not on the `tai42_contract.app.TaiApp`
protocol; the preset routes and the startup/reload rehydration hook reach
it through this concrete instance.
