fast-agent

Python framework and CLI for building and running agents, from the maintainer of the SEP-2640 skills proposal and the HF client telemetry feed. The first client read here that leads with the 2026-07-28 stateless era: it probes server/discover before falling back to the initialize handshake, and behaves differently on each.

At a glance

Registry id fast-agent
Vendor Shaun Smith (llmindset)
Category agent-framework
Platforms windows, macos, linux
Licence Apache-2.0
Source https://github.com/evalstate/fast-agent
Home https://fast-agent.ai/
Wire names fast-agent-mcp
SDK mcp 2.0.0 · declares ==2.0.0 · official Python SDK · unpatched
Prefers 2026-07-28
Speaks 2024-11-05, 2025-03-26, 2025-06-18, 2025-11-25, 2026-07-28
Source last updated 2026-08-23
Last read 2026-08-25
Probed 0.10.53 (see below)
In traffic evalstate/mcp-clients, window ending 2026-11-08 (see below)

Capabilities

Capability Status Known by At
Transports
  ↳ stdio ● full read 2026-07-28
  ↳ sse ● full read 2026-07-28
  ↳ streamableHttp ● full read 2026-07-28
Authentication
  ↳ oauth ● full read 2026-07-28
  ↳ header ● full read 2026-07-28
Tools ● full read 2026-07-28
  ↳ listChanged ● full read 2026-07-28
  ↳ result ● full read 2026-07-28
    ↳ structuredContent ● full read ⇧ 2026-07-28
    ↳ content ◐ partial read ⇧ 2026-07-28
    ↳ media ● full read ⇧ 2026-07-28
Resources ● full read 2026-07-28
  ↳ listChanged ● full read 2026-07-28
  ↳ subscribe ● full read 2026-07-28
Prompts ● full read 2026-07-28
  ↳ listChanged ● full read 2026-07-28
Completions ◐ partial read 2026-07-28
Sampling ● full read 2026-07-28
  ↳ tools ● full read 2026-07-28
  ↳ context ○ unsupported read 2026-07-28
Elicitation ● full read 2026-07-28
  ↳ form ● full read 2026-07-28
  ↳ url ● full read 2026-07-28
Roots ◐ partial read 2026-07-28
  ↳ listChanged ○ unsupported read 2026-07-28
Logging ○ unsupported read 2026-07-28
Instructions ● full read 2026-07-28
Icons ○ unsupported read 2026-07-28
Tasks ○ unsupported read 2026-07-28
JSON Schema — not recorded
Extensions
  ↳ io.modelcontextprotocol/skills ● full read 2026-07-28
Beyond the spec
  ↳ modelInitiatedResourceRead ○ unsupported read 2026-07-28
  ↳ protocolEraForcing ● full read 2026-07-28
  ↳ transportDiagnostics ● full read 2026-07-28
  ↳ remoteFileUriSanitization ● full read 2026-07-28
  ↳ providerManagedMcp ● full read 2026-07-28

● full ◐ partial ○ unsupported · untested — not recorded ⇧ rests on the parent capability's evidence

Not recorded means nobody has looked, which is not the same claim as unsupported. Under tools.result, full means the field reaches the model on the default conversational path, partial means it does under a condition the notes name, and unsupported means it never does.

What the table flattens

Verified by the probe

85 records from the live probe (probe/), client version 0.10.53. Each row is one run against the instrumented fixture server with the model mocked; the verdict says which fixture fields reached the model. Glyphs: […] content, {…} structuredContent, ⟨…⟩ the whole envelope, "…" a placeholder. The scenario link opens the record; the raw captures sit next to it. Overlay: data/verified/fast-agent.json.

Scenario Config Run At Version Verdict
apps.visibility
app_only default http 2026-07-28 0.10.53 tool not offered to the model
app_only default stdio 2026-07-28 0.10.53 tool not offered to the model
app_only anthropic stdio 2026-07-28 0.10.53 tool not offered to the model
app_only legacy stdio 2025-11-25 0.10.53 tool not offered to the model
app_only modern stdio 2026-07-28 0.10.53 tool not offered to the model
tools.result._meta
meta_only default http 2026-07-28 0.10.53 […] content only (1x, as text, _meta did not reach the model)
meta_only default stdio 2026-07-28 0.10.53 […] content only (1x, as text, _meta did not reach the model)
meta_only anthropic stdio 2026-07-28 0.10.53 […] content only (1x, as text, _meta did not reach the model)
meta_only legacy stdio 2025-11-25 0.10.53 […] content only (1x, as text, _meta did not reach the model)
meta_only modern stdio 2026-07-28 0.10.53 […] content only (1x, as text, _meta did not reach the model)
with_meta default http 2026-07-28 0.10.53 {…} structuredContent only (1x, as json, _meta did not reach the model)
with_meta default stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as json, _meta did not reach the model)
with_meta anthropic stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as json, _meta did not reach the model)
with_meta legacy stdio 2025-11-25 0.10.53 {…} structuredContent only (1x, as json, _meta did not reach the model)
with_meta modern stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as json, _meta did not reach the model)
tools.result.audience
audience_user default http 2026-07-28 0.10.53 {…} structuredContent only (1x, as json)
audience_user default stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as json)
audience_user anthropic stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as json)
audience_user legacy stdio 2025-11-25 0.10.53 {…} structuredContent only (1x, as json)
audience_user modern stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as json)
tools.result.content
empty_object default http 2026-07-28 0.10.53 "…" client error text, no fixture field: "Failed to call_tool 'probe_empty_object' on server 'probe': 2 validation errors "
empty_object default stdio 2026-07-28 0.10.53 "…" client error text, no fixture field: "Failed to call_tool 'probe_empty_object' on server 'probe': 2 validation errors "
empty_object anthropic stdio 2026-07-28 0.10.53 "…" client error text, no fixture field: "[{"type":"text","text":"Failed to call_tool 'probe_empty_object' on server 'prob"
empty_object legacy stdio 2025-11-25 0.10.53 "…" client error text, no fixture field: "Failed to call_tool 'probe_empty_object' on server 'probe': 1 validation error f"
empty_object modern stdio 2026-07-28 0.10.53 "…" client error text, no fixture field: "Failed to call_tool 'probe_empty_object' on server 'probe': 2 validation errors "
large default http 2026-07-28 0.10.53 {…} structuredContent only (1x, as text)
large default stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as text)
large anthropic stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as text)
large legacy stdio 2025-11-25 0.10.53 {…} structuredContent only (1x, as text)
large modern stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as text)
no_content_key default http 2026-07-28 0.10.53 "…" client error text, no fixture field: "Failed to call_tool 'probe_no_content_key' on server 'probe': 2 validation error"
no_content_key default stdio 2026-07-28 0.10.53 "…" client error text, no fixture field: "Failed to call_tool 'probe_no_content_key' on server 'probe': 2 validation error"
no_content_key anthropic stdio 2026-07-28 0.10.53 "…" client error text, no fixture field: "[{"type":"text","text":"Failed to call_tool 'probe_no_content_key' on server 'pr"
no_content_key legacy stdio 2025-11-25 0.10.53 "…" client error text, no fixture field: "Failed to call_tool 'probe_no_content_key' on server 'probe': 1 validation error"
no_content_key modern stdio 2026-07-28 0.10.53 "…" client error text, no fixture field: "Failed to call_tool 'probe_no_content_key' on server 'probe': 2 validation error"
tools.result.isError
is_error default http 2026-07-28 0.10.53 {…} structuredContent only (1x, as json)
is_error default stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as json)
is_error anthropic stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as json)
is_error legacy stdio 2025-11-25 0.10.53 {…} structuredContent only (1x, as json)
is_error modern stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as json)
tools.result.media
with_image default http 2026-07-28 0.10.53 {…} structuredContent only (1x, as json)
with_image default stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as json)
with_image anthropic stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as blocks)
with_image legacy stdio 2025-11-25 0.10.53 {…} structuredContent only (1x, as json)
with_image modern stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as json)
tools.result.outputSchema
schema_match default http 2026-07-28 0.10.53 {…} structuredContent only (1x, as json)
schema_match default stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as json)
schema_match anthropic stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as json)
schema_match legacy stdio 2025-11-25 0.10.53 {…} structuredContent only (1x, as json)
schema_match modern stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as json)
schema_mismatch default http 2026-07-28 0.10.53 "…" client error text, no fixture field: "Failed to call_tool 'probe_schema_mismatch' on server 'probe': Invalid structure"
schema_mismatch default stdio 2026-07-28 0.10.53 "…" client error text, no fixture field: "Failed to call_tool 'probe_schema_mismatch' on server 'probe': Invalid structure"
schema_mismatch anthropic stdio 2026-07-28 0.10.53 "…" client error text, no fixture field: "[{"type":"text","text":"Failed to call_tool 'probe_schema_mismatch' on server 'p"
schema_mismatch legacy stdio 2025-11-25 0.10.53 "…" client error text, no fixture field: "Failed to call_tool 'probe_schema_mismatch' on server 'probe': Invalid structure"
schema_mismatch modern stdio 2026-07-28 0.10.53 "…" client error text, no fixture field: "Failed to call_tool 'probe_schema_mismatch' on server 'probe': Invalid structure"
tools.result.structuredContent
mirror default http 2026-07-28 0.10.53 payload once (as json)
mirror default stdio 2026-07-28 0.10.53 payload once (as json)
mirror anthropic stdio 2026-07-28 0.10.53 payload once (as json)
mirror legacy stdio 2025-11-25 0.10.53 payload once (as json)
mirror modern stdio 2026-07-28 0.10.53 payload once (as json)
sc_empty default http 2026-07-28 0.10.53 "…" no marker reached the model; payload: "{}"
sc_empty default stdio 2026-07-28 0.10.53 "…" no marker reached the model; payload: "{}"
sc_empty anthropic stdio 2026-07-28 0.10.53 "…" no marker reached the model; payload: "[{"type":"text","text":"{}"}]"
sc_empty legacy stdio 2025-11-25 0.10.53 "…" no marker reached the model; payload: "{}"
sc_empty modern stdio 2026-07-28 0.10.53 "…" no marker reached the model; payload: "{}"
sc_null default http 2026-07-28 0.10.53 […] content only (1x, as text)
sc_null default stdio 2026-07-28 0.10.53 […] content only (1x, as text)
sc_null anthropic stdio 2026-07-28 0.10.53 […] content only (1x, as text)
sc_null legacy stdio 2025-11-25 0.10.53 […] content only (1x, as text)
sc_null modern stdio 2026-07-28 0.10.53 […] content only (1x, as text)
sc_string default http 2026-07-28 0.10.53 {…} structuredContent only (1x, as text)
sc_string default stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as text)
sc_string anthropic stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as text)
sc_string legacy stdio 2025-11-25 0.10.53 "…" client error text, no fixture field: "Failed to call_tool 'probe_sc_string' on server 'probe': 1 validation error for "
sc_string modern stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as text)
structured_only default http 2026-07-28 0.10.53 {…} structuredContent only (1x, as json)
structured_only default stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as json)
structured_only anthropic stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as json)
structured_only legacy stdio 2025-11-25 0.10.53 {…} structuredContent only (1x, as json)
structured_only modern stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as json)
summary_and_data default http 2026-07-28 0.10.53 {…} structuredContent only (1x, as json)
summary_and_data default stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as json)
summary_and_data anthropic stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as json)
summary_and_data legacy stdio 2025-11-25 0.10.53 {…} structuredContent only (1x, as json)
summary_and_data modern stdio 2026-07-28 0.10.53 {…} structuredContent only (1x, as json)

Observed in traffic

From evalstate/mcp-clients at c30d6f28, report generated 2026-11-09, window 2026-09-10 to 2026-11-08. Grouped as fast-agent from wire names fast-agent-mcp. Tool calls by revision over the 30 days to 2026-11-06: 2026-07-28 100%.

Capability Observed At Registry Note
elicitation ● full ? ● full Set because the initialize-era backfill (2026-06-07/2026-07-26) has it, or because more than 50% of 2026-07-28 tool calls declared it; the report does not say which, so no revision is recorded.
elicitation.url ● full ? ● full Set because the initialize-era backfill (2026-06-07/2026-07-26) has it, or because more than 50% of 2026-07-28 tool calls declared it; the report does not say which, so no revision is recorded.
apps ○ unsupported 2026-07-28 — not recorded At most 50% of this client's 2026-07-28 tool calls in the window declared it, and the initialize-era backfill does not have it.
tasks ○ unsupported 2026-07-28 ○ unsupported At most 50% of this client's 2026-07-28 tool calls in the window declared it.

≠ the observed status differs from the registry's. The registry status may be about a different revision; compare the At column with the evidence above. Every row is read against the source's policy block, carried verbatim in data/observed/hf-mcp-clients.json.

Research notes

Provenance

Read at 1b58e686 on 2026-08-25, from main of https://github.com/evalstate/fast-agent.git. That commit was authored 2026-08-23.

SDK. The first Python-SDK read in the registry, and the first client on an SDK that speaks 2026-07-28. Both mcp and its split-out mcp-types are pinned to exactly 2.0.0 in pyproject.toml and resolve there in uv.lock; there is no [tool.uv] override and no vendored fork. src/fast_agent/patch/ is a Python port of codex apply_patch, not an SDK patch. The version range is entirely the SDK's — fast-agent names no revision of its own and picks an era instead, so pinsProtocolVersion would misstate what is happening: the SDK pins both ends of the range, and fast-agent chooses which end to try first.

Paths read:

Source is not vendored. To reproduce any claim above, check out that commit in the client's repository.


Generated from data/clients.json, data/verified/fast-agent.json, data/observed/hf-mcp-clients.json by scripts/build-cards.js. Edit the registry, rerun the probe or the ingest, not this file.