outputSchema is generated for the deserialize contract; tool results are serialised
Mantenedores costumam responder em até 3 dias
Avaliação
Esta issue ainda não foi avaliada.
Descrição
Problem
schema_for_output::<T>() builds a tool's outputSchema through schema_for_type, which uses SchemaSettings::draft2020_12(), i.e. schemars' default Contract::Deserialize (crates/rmcp/src/handler/server/common.rs, still the case on main at ad5a284). A tool result is a value the server serialises, so its schema should describe what Serialize writes. Under the deserialize contract the advertised schema is wrong for common shapes:
- an
Option<T>field withoutskip_serializing_ifis always written (asnull), but is advertised as optional; - a
#[serde(default)]field is always written, but is advertised as optional; - a type that accepts several forms and writes one (e.g.
rust_decimal::Decimal: string or number in, string out) is advertised with every accepted form.
A client or model reading outputSchema is told a field may be absent when the server always sends it, or may be a number when the server sends a string.
Repro
#[derive(serde::Serialize, schemars::JsonSchema)]
struct Out {
always: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
sometimes: Option<i32>,
}
// schema_for_output::<Out>()["required"] is absent; it should be ["always"].
Proposed fix
schema_for_output generates with SchemaSettings::draft2020_12().for_serialize(). Inputs (schema_for_type) stay on the deserialize contract. There is no public API change. For types whose two forms are equal, the output schema is byte-identical.
I have a patch against main with two tests (an always-written Option is required in an output schema; an input Option stays optional). cargo test -p rmcp --features server,client,macros,schemars,transport-io passes. I'm happy to open the PR if this direction is welcome.
- Linguagem predominante
- Rust
- Estrelas
- 4.1k
- Forks
- 694
- Merge médio
- 4d 9h
- PRs com merge (30d)
- 41
Preparar o ambiente
Inicia o contêiner de desenvolvimento do projeto no navegador, com a sua própria conta do GitHub.
- Sem Dockerfile nem arquivo Docker Compose
- Sem modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de modelcontextprotocol/rust-sdk
-
Support tool exposure modes (direct / deferred / codemode) and client-side aggregation.Talvez já em andamento @jamadeo assumiu hoje. Abertaenhancement P3 T-model T-service
modelcontextprotocol/rust-sdk#1437 · 1 comentário · 1 responsável ·
Mantenedores costumam responder em até 3 dias
-
Return MergedList<T> from list_all_* and drop the _with_cache_hint variantsTalvez já em andamento @DaleSeo assumiu há 4 dias. Abertaenhancement P3 ready for work T-service v4
modelcontextprotocol/rust-sdk#1430 · 1 responsável ·
Mantenedores costumam responder em até 3 dias
-
Server logs a fabricated 'initialize' (with synthesized rmcp/3.8.0 peer identity) for no-initialize SEP-2567 requests, ignoring clientInfo from _metaTalvez já em andamento @jamadeo assumiu há 4 dias. Abertabug P2 ready for work T-service T-transport
modelcontextprotocol/rust-sdk#1425 · 2 comentários · 1 responsável ·
Mantenedores costumam responder em até 3 dias
-
OAuth discovery drops explicit default ports from advertised issuer identifiersTalvez já em andamento @gocamille assumiu há 6 dias. Abertabug P1 ready for work T-security T-transport
modelcontextprotocol/rust-sdk#1420 · 4 comentários · 1 responsável ·
Mantenedores costumam responder em até 3 dias
-
`register_client` drops `client_secret_expires_at` from the registration responseTalvez já em andamento @gocamille assumiu há 8 dias. Abertabug P2 ready for work T-security
modelcontextprotocol/rust-sdk#1416 · 1 comentário · 1 responsável ·
Mantenedores costumam responder em até 3 dias
Todas as issues de modelcontextprotocol/rust-sdk
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
rubys/roundhouse#1917 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
Mantenedores costumam responder em até 2 dias
-
good first issue
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 88/100
Mantenedores costumam responder em até 1 dia
-
[cosmic-applet-battery] Division by zero displays NaN% when UPower reports max_brightness = 0Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
pop-os/cosmic-applets#1619 ·
Mantenedores costumam responder em até 3 dias
-
binding:python bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
Mantenedores costumam responder em até 1 dia