noyalib-mcp
This server provides lossless YAML read and write operations via MCP tools, along with configurable transports and protocol negotiation.
Read YAML values with
noyalib_get: fetch the exact source slice at a dotted/indexed path, preserving formatting and comments.Write YAML values with
noyalib_set: update a value at a path, rewriting only the touched span while preserving all other content, with atomic writes and no change on parse errors.Support for common transports: stdio (default), streamable HTTP, and legacy HTTP+SSE.
Protocol version negotiation during initialization (supports revisions from 2024-11-05 to 2026-07-28).
Additional agent integration via prompts and resources (though not shown in the provided schema).
Contents
Getting started
Install — Cargo, npm wrapper, and container
Requirements — toolchain floor, platforms
Quick Start — start a server over stdio or HTTP
The noyalib-mcp ecosystem
The noyalib-mcp ecosystem — protocol and library relationships
Library reference
Capabilities at a glance — the current surface by theme
Ecosystem comparison — short matrix; full table at
docs/COMPARISON.mdBenchmarks — harness coverage; full method at
docs/BENCHMARKS.mdFeatures — MCP tools and resources
Configuration — transports and endpoints
Examples — runnable clients
Operational
When not to use noyalib-mcp — limitations
Development — make targets, fuzzing, CI
Security — guarantees and compliance
Documentation — all reference docs
Stability guarantees — protocol, SemVer, and toolchain discipline
Related MCP server: mcp-json-yaml-toml
Install
As a Rust library
[dependencies]
noyalib-mcp = "0.0.51"Install or run the server through the channel that fits the host:
cargo install noyalib-mcp --locked
npx @sebastienrousseau/noyalib-mcp
docker run --rm -i ghcr.io/sebastienrousseau/noyalib-mcp:latestRequirements
Rust 1.88.0 or newer when building from source.
Linux, macOS, and Windows are tested by CI.
The crate pins
noyalibat exactly=0.0.51under the lockstep contract.An MCP client is required to drive the server.
Surface | Minimum toolchain | Enforcement |
Server and library | Rust 1.88.0 | manifest and MSRV CI |
Complete test surface | Rust 1.88.0 | all-target CI |
Quick Start
Use stdio for a child-process integration:
noyalib-mcpA stdio client begins with an MCP initialization request before sending the initialized notification or listing tools:
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-11-25",
"capabilities": {},
"clientInfo": {
"name": "example",
"version": "0.0.1"
}
}
}Serve streamable HTTP at /mcp, or the legacy HTTP+SSE bridge at /sse
and /messages/:
noyalib-mcp --transport streamable-http --host 127.0.0.1 --port 8000
noyalib-mcp --transport sse --host 127.0.0.1 --port 8001The server negotiates supported MCP revisions during initialize; clients
should not send raw tool calls before completing that handshake.
The noyalib-mcp ecosystem
Component | Role |
| MCP server, transports, tools, prompts, and resources |
YAML parser, CST editor, and schema validator | |
Human-facing formatting and validation commands | |
| Official Rust MCP SDK used for protocol handling |
Capabilities at a glance
Area | Capability | Status |
Transport | stdio, streamable HTTP, and HTTP+SSE | Supported |
Protocol | Revisions from 2024-11-05 through 2026-07-28 | Negotiated |
Results | Text plus typed | Supported |
YAML | Parse, get, set, multidocument set, edit, and validate | Supported |
Metadata | Tool schemas, annotations, examples, prompts, and resources | Published |
Ecosystem comparison
Delivery surface | Lossless YAML edits | Remote transport | Typed tool results |
noyalib-mcp | Yes | HTTP and SSE | Yes |
| Yes | No | Not applicable |
| Yes | No | Native Rust types |
See docs/COMPARISON.md for scope and evidence.
Benchmarks
The checked-in mcp_tools Criterion harness measures tool dispatch and YAML
operations without treating noisy timing values as correctness gates.
cargo bench --bench mcp_toolsSee docs/BENCHMARKS.md for methodology.
Features
Six typed tools for YAML reads, edits, parsing, and validation.
Declared
outputSchema,structuredContent, annotations, and examples.stdio, streamable HTTP, and legacy HTTP+SSE transports.
Prompts and resources for agent integration.
Protocol revision negotiation and session-aware routing.
Configuration
Option | Effect |
| Use process stdin and stdout; this is the default |
| Serve MCP at |
| Serve |
| Bind an HTTP transport to an address |
| Select the HTTP listening port |
Bind remote transports deliberately. The default loopback host avoids exposing the server beyond the local machine.
Examples
mcp_session.rs: SDK-backed in-memory session.handshake.sh: initialize and list tools.set-then-get.sh: lossless mutation and readback.
Client configuration recipes are in
docs/agent-integration.md.
When not to use noyalib-mcp
Use
noyalibdirectly inside a Rust application that does not need MCP.Use
noya-clifor shell pipelines and repository-wide validation.Do not expose an HTTP transport to an untrusted network without an authentication and authorization layer in front of it.
The server does not fetch remote schemas; callers must supply trusted schema content.
The detailed README reference retains client setup, tool detail, verification steps, and conformance discussion.
Development
make
make test
make clippy
make fmt
cargo fuzz run fuzz_tool_callCI checks Rust formatting, linting, tests, documentation, dependency policy,
fuzz regressions, protocol behaviour, and the shared YAML test suite. See
DEVELOPMENT.md.
Security
Report vulnerabilities through SECURITY.md. The crate forbids
unsafe code, audits dependencies, uses bounded noyalib operations, and emits
release attestations and SBOMs. Treat file content, YAML, schemas, and MCP
metadata as untrusted input.
Documentation
Stability guarantees
During
0.0.x, the patch component is the breaking-change axis.Tool names, argument schemas, output schemas, and transport routes form the public compatibility surface.
Protocol revisions are negotiated rather than inferred.
The MSRV may rise only on the breaking axis with a changelog explanation.
License
Licensed under either Apache License 2.0 or MIT, at your option.
Available Tools
2 toolsnoyalib_getRead a YAML value (lossless)ARead-onlyIdempotent
Read the YAML value at a dotted/indexed path in the given file and return the source slice exactly — no re-quoting, no canonicalisation, comments and formatting preserved. Use this to inspect a value before changing it; use noyalib_set to write a value back losslessly.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | Path to the YAML file on disk. | |
| path | Yes | Dotted/indexed path into the YAML, e.g. `server.host` or `items[0].name`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, etc. Description adds specifics about returning source slice exactly, preserving comments and formatting, which adds value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences that efficiently convey purpose and usage guidance with zero wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with two parameters, the description covers behavior, usage context, and alternatives. No output schema needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with adequate descriptions. The description provides example path formats, adding slight value over schema alone. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The title and description clearly state it reads a YAML value at a path, with specific details about losslessness and preservation of formatting. It distinguishes from the sibling noyalib_set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this to inspect a value before changing it; use noyalib_set to write back losslessly,' providing clear when-to-use and alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
noyalib_setWrite a YAML value (lossless)ADestructiveIdempotent
Set the YAML value at a dotted/indexed path in the given file, rewriting only the touched span so every comment, blank line, and sibling entry is preserved byte-for-byte (written atomically). Use this for Renovate-style version bumps and config patches; use noyalib_get first when you need to read the current value. On a parse error the document is left unchanged.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | Path to the YAML file on disk. | |
| path | Yes | Dotted/indexed path into the YAML. | |
| value | Yes | Replacement value as a YAML fragment (e.g. `0.0.2`, `\"hello\"`, `[1, 2, 3]`). Must parse in the target position; the document is left unchanged on parse error. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate mutating and idempotent. Description adds valuable context: lossless rewriting, atomicity, and preservation of comments/blanks. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with core behavior. Every sentence adds unique information: purpose/feature, usage guidance, error behavior. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, description covers essential aspects: input parameters, behavior (atomic, lossless), error handling. Sufficient for correct agent invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds examples and constraints for the 'value' parameter (YAML fragment, parse requirement), enhancing understanding beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Set'), resource ('YAML value at a dotted/indexed path'), and key behavior ('lossless', 'atomic'). It clearly distinguishes from sibling 'noyalib_get' by focusing on writing vs reading.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use ('Renovate-style version bumps and config patches') and recommends reading first with 'noyalib_get'. Also explains behavior on parse error, leaving document unchanged.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
- First observed
noyalib_get - First observed
noyalib_set
TDQS
Scored across 2 tools
The two tools have completely distinct and complementary roles: one for reading values (noyalib_get) and one for writing values (noyalib_set). There is no overlap in functionality, and the descriptions explicitly guide when to use each.
Both tools follow a consistent 'noyalib_verb' pattern with clear action verbs 'get' and 'set'. The naming is predictable and matches conventional CRUD terminology.
With only two tools, the set is minimal but appropriate for the focused purpose of reading and writing YAML paths losslessly. It covers the core operations without unnecessary bloat, though additional operations like deletion could be warranted.
The tools cover the essential read and write operations for YAML path manipulation. However, there is no tool for deleting or listing paths, which might be needed in some workflows. The set is complete for its stated use case (version bumps and config patches) but not fully generic.
Maintenance
Related MCP Connectors
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
MCP server for progressive tool usage at any scale (see https://klavis.ai)
MCP server for Clipkit — gives AI agents a video toolbox via the Clipkit schema.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceA server for the Machine Chat Protocol (MCP) that provides a YAML-based configuration system for LLM applications, allowing users to define resources, tools, and prompts without writing code.6MIT
- AlicenseAqualityBmaintenanceA token-efficient, schema-aware MCP server that enables AI assistants to safely read, modify, query, and validate JSON, YAML, and TOML files with automatic schema detection and format conversion capabilities.825 PyPI10MIT
- AlicenseNot gradedqualityBmaintenanceMCP server wrapping local Ollama models for offload from API-priced orchestrators. Nine stdio tools - generation, summarisation, analysis, drafting, code tasks (docstring/test/explain/review/types/refactor-suggest), diff-driven tasks (commit-message/pr-description/changelog/summary/impact), mechanical transforms, and model management (list/pull). Apache-2.0.19 npmApache 2.0
- AlicenseAqualityCmaintenanceDeterministic dependency + CVE context for AI coding tools, over the Model Context Protocol. A ~0.85 MB pure-Rust MCP server.21MIT