Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions docs/development/v3-notes/v3-features.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,72 @@ title: v3.0 Feature Tracking

This document tracks major features in FastMCP v3.0 for release notes preparation.

## 3.0.0rc1

### Concurrent Tool Execution in Sampling

When an LLM returns multiple tool calls in a single sampling response, they can now be executed concurrently ([#3022](https://github.com/jlowin/fastmcp/pull/3022)). Default behavior remains sequential; opt in with `tool_concurrency`. Tools can declare `sequential=True` to force sequential execution even when concurrency is enabled.

```python
result = await context.sample(
messages="Fetch weather for NYC and LA",
tools=[fetch_weather],
tool_concurrency=0, # Unlimited parallel execution
)
```
Comment on lines +13 to +19
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check how tool_concurrency is documented/validated in the source
rg -n -C3 'tool_concurrency' --type=py

Repository: jlowin/fastmcp

Length of output: 14020


🏁 Script executed:

cd docs/development/v3-notes && head -30 v3-features.mdx

Repository: jlowin/fastmcp

Length of output: 1224


Add prose clarification for tool_concurrency=0 semantics.

The inline code comment is clear and correct, but per documentation guidelines, add explicit mention in the prose (before the code example) that tool_concurrency=0 enables unlimited parallel execution. This helps readers who scan the text without reading code comments.

Note: The codebase does not provide alternative constants (None, math.inf, etc.) for unlimited concurrency; 0 is the intentional API design.


### OpenAPI `validate_output` Option

`OpenAPIProvider` and `FastMCP.from_openapi()` now accept `validate_output=False` to skip output schema validation ([#3134](https://github.com/jlowin/fastmcp/pull/3134)). Useful when backends don't conform to their own OpenAPI response schemas — structured JSON still flows through, only the strict schema checking is disabled.

```python
mcp = FastMCP.from_openapi(
openapi_spec=spec,
client=client,
validate_output=False,
)
```

### Auth Token Injection and Azure OBO Dependencies

New dependency injection for accessing the authenticated user's token directly in tool parameters ([#2918](https://github.com/jlowin/fastmcp/pull/2918)). Works with any auth provider.

```python
from fastmcp.server.dependencies import CurrentAccessToken, TokenClaim
from fastmcp.server.auth import AccessToken

@mcp.tool()
async def my_tool(
token: AccessToken = CurrentAccessToken,
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Call CurrentAccessToken() in token injection example

The new example passes CurrentAccessToken without invoking it, but dependency injection only resolves parameters whose defaults are Dependency instances, and CurrentAccessToken is a factory function that returns that instance (src/fastmcp/_vendor/docket_di/__init__.py and src/fastmcp/server/dependencies.py). If readers copy this snippet as-is, they will pass a plain function object as the default and token injection will not run.

Useful? React with 👍 / 👎.

user_id: str = TokenClaim("oid"),
): ...
```

For Azure/Entra, the new `fastmcp[azure]` extra adds `EntraOBOToken` and `MSALApp` dependencies that handle the On-Behalf-Of token exchange declaratively:
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Remove nonexistent MSALApp dependency from rc1 notes

This release note says fastmcp[azure] adds an MSALApp dependency, but the Azure provider implementation only defines EntraOBOToken for this workflow (src/fastmcp/server/auth/providers/azure.py) and there is no MSALApp API to import in the repo. That makes the documented capability unusable for anyone trying to follow the rc1 notes.

Useful? React with 👍 / 👎.


```python
from fastmcp.server.auth.providers.azure import EntraOBOToken

@mcp.tool()
async def get_emails(
graph_token: str = EntraOBOToken(["https://graph.microsoft.com/Mail.Read"]),
):
# graph_token is ready — OBO exchange happened automatically
...
```

### `generate-cli` Agent Skill Generation

`fastmcp generate-cli` now produces a `SKILL.md` alongside the CLI script ([#3115](https://github.com/jlowin/fastmcp/pull/3115)) — a Claude Code agent skill with pre-computed invocation syntax for every tool. Agents reading the skill can call tools immediately without running `--help`. On by default; pass `--no-skill` to opt out.

### Background Task Notification Queue

Background tasks now use a distributed Redis notification queue for reliable delivery ([#2906](https://github.com/jlowin/fastmcp/pull/2906)). Elicitation switches from polling to BLPOP (single blocking call instead of ~7,200 round-trips/hour), and notification delivery retries up to 3x with TTL-based expiration.

### Breaking: `ui=` Renamed to `app=`

The MCP Apps decorator parameter has been renamed from `ui=ToolUI(...)` / `ui=ResourceUI(...)` to `app=AppConfig(...)` ([#3117](https://github.com/jlowin/fastmcp/pull/3117)). `ToolUI` and `ResourceUI` are consolidated into a single `AppConfig` class. Wire format is unchanged. See the MCP Apps section under beta2 for full details.

## 3.0.0beta2

### CLI: `fastmcp list` and `fastmcp call`
Expand Down
Loading