> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.nvidia.com/nemo/gym/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.nvidia.com/nemo/gym/_mcp/server.

# nemo_gym.base_resources_server

## Module Contents

### Classes

| Name                                                                                         | Description                                                           |
| -------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
| [`BaseResourcesServer`](#nemo_gym-base_resources_server-BaseResourcesServer)                 | -                                                                     |
| [`BaseResourcesServerConfig`](#nemo_gym-base_resources_server-BaseResourcesServerConfig)     | -                                                                     |
| [`BaseRunRequest`](#nemo_gym-base_resources_server-BaseRunRequest)                           | -                                                                     |
| [`BaseSeedSessionRequest`](#nemo_gym-base_resources_server-BaseSeedSessionRequest)           | -                                                                     |
| [`BaseSeedSessionResponse`](#nemo_gym-base_resources_server-BaseSeedSessionResponse)         | -                                                                     |
| [`BaseVerifyRequest`](#nemo_gym-base_resources_server-BaseVerifyRequest)                     | -                                                                     |
| [`BaseVerifyResponse`](#nemo_gym-base_resources_server-BaseVerifyResponse)                   | -                                                                     |
| [`MCPResourcesServer`](#nemo_gym-base_resources_server-MCPResourcesServer)                   | SimpleResourcesServer variant that also exposes Gym-owned MCP tools.  |
| [`MCPServerMetadata`](#nemo_gym-base_resources_server-MCPServerMetadata)                     | Metadata returned from /seed\_session for per-rollout Gym MCP access. |
| [`MCPSessionError`](#nemo_gym-base_resources_server-MCPSessionError)                         | A Gym MCP tool call lacked a valid per-rollout session token.         |
| [`SimpleResourcesServer`](#nemo_gym-base_resources_server-SimpleResourcesServer)             | -                                                                     |
| [`_MCPHeaderSessionMiddleware`](#nemo_gym-base_resources_server-_MCPHeaderSessionMiddleware) | -                                                                     |

### Functions

| Name                                                   | Description                                                       |
| ------------------------------------------------------ | ----------------------------------------------------------------- |
| [`gym_tool`](#nemo_gym-base_resources_server-gym_tool) | Mark a resources-server method as a tool to auto-expose over MCP. |

### Data

[`NEMO_GYM_MCP_METADATA_KEY`](#nemo_gym-base_resources_server-NEMO_GYM_MCP_METADATA_KEY)

[`NEMO_GYM_MCP_SESSION_TOKEN_HEADER`](#nemo_gym-base_resources_server-NEMO_GYM_MCP_SESSION_TOKEN_HEADER)

[`RESERVED_MCP_TOOL_NAMES`](#nemo_gym-base_resources_server-RESERVED_MCP_TOOL_NAMES)

[`_MCP_SESSION_TOKEN`](#nemo_gym-base_resources_server-_MCP_SESSION_TOKEN)

[`_MCP_TOKEN_SALT`](#nemo_gym-base_resources_server-_MCP_TOKEN_SALT)

### API

```python
class nemo_gym.base_resources_server.BaseResourcesServer()
```

**Bases:** [BaseServer](/nemo-gym/nemo_gym/server_utils#nemo_gym-server_utils-BaseServer)

```python
class nemo_gym.base_resources_server.BaseResourcesServerConfig()
```

**Bases:** [BaseRunServerInstanceConfig](/nemo-gym/nemo_gym/config_types#nemo_gym-config_types-BaseRunServerInstanceConfig)

```python
class nemo_gym.base_resources_server.BaseRunRequest()
```

**Bases:** `BaseModel`

```python
class nemo_gym.base_resources_server.BaseSeedSessionRequest()
```

**Bases:** `BaseModel`

```python
class nemo_gym.base_resources_server.BaseSeedSessionResponse()
```

**Bases:** `BaseModel`

```python
class nemo_gym.base_resources_server.BaseVerifyRequest()
```

**Bases:** [BaseRunRequest](#nemo_gym-base_resources_server-BaseRunRequest)

```python
class nemo_gym.base_resources_server.BaseVerifyResponse()
```

**Bases:** [BaseVerifyRequest](#nemo_gym-base_resources_server-BaseVerifyRequest)

```python
class nemo_gym.base_resources_server.MCPResourcesServer()
```

**Bases:** [SimpleResourcesServer](#nemo_gym-base_resources_server-SimpleResourcesServer)

SimpleResourcesServer variant that also exposes Gym-owned MCP tools.

Subclasses decorate tool methods with `@gym_tool` (the default `register_mcp_tools`
auto-registers them; override only for manual control) and call `build_mcp_session_metadata`
from `seed_session` to hand the agent a per-rollout token. A `@gym_tool` method receives the
Gym session by declaring a `session_id` parameter, which the base resolves from that token (a
stateless signed value) so tool calls share the session id used by /seed\_session and /verify.

```python
nemo_gym.base_resources_server.MCPResourcesServer._mcp_token_serializer() -> itsdangerous.URLSafeSerializer
```

```python
nemo_gym.base_resources_server.MCPResourcesServer._register_gym_tool(
    mcp: typing.Any,
    name: str,
    method: typing.Any
) -> None
```

Register one bound `@gym_tool` method as an MCP tool.

Builds a wrapper whose signature mirrors the method's parameters minus `session_id` (so the
session id stays out of the model-visible input schema) and injects the resolved Gym session id
at call time. Enforces the `@gym_tool` constraints.

```python
nemo_gym.base_resources_server.MCPResourcesServer.build_mcp_session_metadata(
    request: fastapi.Request
) -> nemo_gym.base_resources_server.MCPServerMetadata
```

```python
nemo_gym.base_resources_server.MCPResourcesServer.register_mcp_tools(
    mcp: typing.Any
) -> None
```

Auto-register methods decorated with `@gym_tool` as MCP tools.

Subclasses can either rely on this default (just decorate tool methods with `@gym_tool`) or
override it for full manual control. To add manual `@mcp.tool()` functions on top of the
auto-registered ones, call `super().register_mcp_tools(mcp)` first.

```python
nemo_gym.base_resources_server.MCPResourcesServer.require_mcp_session_id() -> str
```

```python
nemo_gym.base_resources_server.MCPResourcesServer.setup_webserver() -> fastapi.FastAPI
```

```python
class nemo_gym.base_resources_server.MCPServerMetadata()
```

**Bases:** `BaseModel`

Metadata returned from /seed\_session for per-rollout Gym MCP access.

```python
class nemo_gym.base_resources_server.MCPSessionError()
```

Exception

**Bases:** `Exception`

A Gym MCP tool call lacked a valid per-rollout session token.

Deliberately not an HTTP error: MCP runs over JSON-RPC, so FastMCP returns HTTP 200 and surfaces
this to the client as a tool error (`isError: true`). An HTTP status code raised here would
never reach the caller, so we raise a plain error with a clear message instead.

```python
class nemo_gym.base_resources_server.SimpleResourcesServer()
```

**Bases:** [BaseResourcesServer](#nemo_gym-base_resources_server-BaseResourcesServer), [AggregateMetricsMixin](/nemo-gym/nemo_gym/reward_profile#nemo_gym-reward_profile-AggregateMetricsMixin), [SimpleServer](/nemo-gym/nemo_gym/server_utils#nemo_gym-server_utils-SimpleServer)

```python
nemo_gym.base_resources_server.SimpleResourcesServer.aggregate_metrics(
    body: nemo_gym.config_types.AggregateMetricsRequest
) -> nemo_gym.config_types.AggregateMetrics
```

async

Compute aggregate metrics from verify responses.

RewardProfiler provides baseline stats. Override compute\_metrics() and/or
get\_key\_metrics() for benchmark-specific customization.

```python
nemo_gym.base_resources_server.SimpleResourcesServer.seed_session(
    body: nemo_gym.base_resources_server.BaseSeedSessionRequest
) -> nemo_gym.base_resources_server.BaseSeedSessionResponse
```

async

```python
nemo_gym.base_resources_server.SimpleResourcesServer.setup_webserver() -> fastapi.FastAPI
```

```python
nemo_gym.base_resources_server.SimpleResourcesServer.verify(
    body: nemo_gym.base_resources_server.BaseVerifyRequest
) -> nemo_gym.base_resources_server.BaseVerifyResponse
```

async

abstract

```python
class nemo_gym.base_resources_server._MCPHeaderSessionMiddleware(
    app: typing.Any
)
```

```python
nemo_gym.base_resources_server._MCPHeaderSessionMiddleware.__call__(
    scope,
    receive,
    send
)
```

async

```python
nemo_gym.base_resources_server.gym_tool(
    fn
)
```

Mark a resources-server method as a tool to auto-expose over MCP.

The method is registered as an MCP tool named after the method, and its MCP input schema is
derived from the method's typed parameters. Declare a `session_id: str` parameter to receive
the per-rollout Gym session id; it is injected automatically (from the hidden session token) and
hidden from the tool's input schema. The method must NOT take a `request` parameter — there is
no FastAPI `Request` on the MCP path; use `session_id` instead. Both sync and async methods
are supported.

```python
nemo_gym.base_resources_server.NEMO_GYM_MCP_METADATA_KEY = 'mcp'
```

```python
nemo_gym.base_resources_server.NEMO_GYM_MCP_SESSION_TOKEN_HEADER = 'X-NeMo-Gym-Session-Token'
```

```python
nemo_gym.base_resources_server.RESERVED_MCP_TOOL_NAMES = frozenset({'verify', 'seed_session', 'aggregate_metrics', 'mcp'})
```

```python
nemo_gym.base_resources_server._MCP_SESSION_TOKEN: ContextVar[Optional[str]] = ContextVar('nemo_gym_mcp_session_token', default=None)
```

```python
nemo_gym.base_resources_server._MCP_TOKEN_SALT = 'nemo-gym-mcp-session-token'
```