noyalib-mcp
MCP server for lossless YAML 1.2 editing by AI agents. Two tools — noyalib_get (read a value at a dotted/indexed path) and noyalib_set (write a value, preserving comments/formatting byte-for-byte). Pure Rust, streaming-first serde, JSON Schema validation. MIT OR Apache-2.0.
README
<!-- SPDX-License-Identifier: Apache-2.0 OR MIT -->
<p align="center"> <img src="https://cloudcdn.pro/noyalib/v1/logos/noyalib.svg" alt="Noyalib logo" width="128" /> </p>
<h1 align="center">noyalib-mcp</h1>
<p align="center"> <strong>Model Context Protocol server exposing noyalib's lossless YAML editing to AI agents (Claude Desktop, Claude Code, Cursor, Zed, Continue.dev, …).</strong> </p>
<p align="center"> <a href="https://github.com/sebastienrousseau/noyalib-mcp/actions"><img src="https://img.shields.io/github/actions/workflow/status/sebastienrousseau/noyalib-mcp/ci.yml?style=for-the-badge&logo=github" alt="Build" /></a> <a href="https://crates.io/crates/noyalib-mcp"><img src="https://img.shields.io/crates/v/noyalib-mcp.svg?style=for-the-badge&color=fc8d62&logo=rust" alt="Crates.io" /></a> <a href="https://docs.rs/noyalib-mcp"><img src="https://img.shields.io/badge/docs.rs-noyalib--mcp-66c2a5?style=for-the-badge&labelColor=555555&logo=docs.rs" alt="Docs.rs" /></a> <a href="https://lib.rs/crates/noyalib-mcp"><img src="https://img.shields.io/badge/lib.rs-noyalib-orange.svg?style=for-the-badge" alt="lib.rs" /></a> <a href="https://scorecard.dev/viewer/?uri=github.com/sebastienrousseau/noyalib-mcp"><img src="https://img.shields.io/ossf-scorecard/github.com/sebastienrousseau/noyalib-mcp?style=for-the-badge&label=OpenSSF%20Scorecard&logo=openssf" alt="OpenSSF Scorecard" /></a> </p>
Contents
- Install — Cargo, npx, Docker
- Quick Start — JSON-RPC handshake
- Why this approach? — design rationale
- Connect — per-client configuration
- Tools exposed — MCP tool reference
- Examples — runnable scripts
- Verification — cosign + npm provenance
- When not to use noyalib-mcp
- Documentation
- License
Install
cargo install noyalib-mcp
For environments without a Rust toolchain (the typical AI-agent deployment shape):
# npm wrapper — auto-downloads the matching binary on first run,
# caches under ~/.cache/noyalib-mcp/<version>/.
npx @sebastienrousseau/noyalib-mcp
# Container — multi-arch (linux/amd64, linux/arm64).
docker run --rm -i ghcr.io/sebastienrousseau/noyalib-mcp:latest
Split from the monorepo since v0.0.13. Prior versions shipped from
sebastienrousseau/noyalib/crates/noyalib-mcp/under the workspace-lockstep release cadence. From v0.0.13 onwardnoyalib-mcplives here as its own crate, still released in strict lockstep with the parentnoyalibat the same version. See ADR-0005 for the rationale and rollback recipe.
Both consume the same signed binary attached to every GitHub Release. See Verification for the verify commands.
Quick Start
The server speaks JSON-RPC 2.0 over stdio with newline-delimited
frames, per the
MCP specification. A typical
agent launches the binary as a child process, sends
initialize, then dispatches tool calls:
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"agent","version":"0.0.1"}}}
{"jsonrpc":"2.0","method":"notifications/initialized"}
{"jsonrpc":"2.0","id":2,"method":"tools/list"}
{"jsonrpc":"2.0","id":3,"method":"tools/call",
"params":{"name":"format","arguments":{"yaml":"a:1\nb:2\n"}}}
Why this approach?
AI agents that edit YAML configuration today regex-replace and corrupt comments, indentation, and document structure. The same agent fixing a port number in a Kubernetes manifest can shift every comment by a line, reorder sibling keys, or strip trailing whitespace that a downstream linter cared about.
noyalib's CST does the edits losslessly — a set("server.port", "9090") rewrites only the byte span of the 8080 scalar; the
surrounding comments and indentation pass through untouched.
This server is the protocol shim that lets MCP-aware clients
drive that engine safely:
- Lossless mutation.
tools/call setreturns a document byte-identical to the input outside the touched span. - Surgical reads.
tools/call getwalks the dotted path and returns just the value, not the whole tree. - Schema validation.
tools/call validate --schemaruns the same JSON Schema 2020-12 enginenoyavalidateships. - Stdio transport. Standard MCP. Works with every spec-compliant client.
Connect
Claude Desktop / Claude Code
claude mcp add noyalib $(which noyalib-mcp)
Cursor
~/.cursor/mcp.json:
{
"mcpServers": {
"noyalib": {
"command": "noyalib-mcp"
}
}
}
Zed
~/.config/zed/settings.json:
{
"context_servers": {
"noyalib": {
"command": { "path": "noyalib-mcp" }
}
}
}
Continue.dev
~/.continue/config.json:
{
"experimental": {
"modelContextProtocolServers": [
{ "transport": { "type": "stdio", "command": "noyalib-mcp" } }
]
}
}
Any other MCP-aware client
Point at the binary; the transport is stdio with newline- delimited JSON-RPC 2.0.
Tools exposed
The v0.0.1 server registers two file-oriented tools — both
operate on a YAML file at file: <path>, not on inline source
strings, so an agent's edits land on disk losslessly:
| Tool | Arguments | Returns |
|---|---|---|
noyalib_get |
{ file: string, path: string } |
The raw source fragment at the dotted/indexed path (e.g. server.host, items[0].name). No re-quoting; no canonicalisation. |
noyalib_set |
{ file: string, path: string, value: string } |
The file rewritten via the lossless CST so only the touched span changes; comments, blank lines, and sibling formatting survive byte-for-byte. The value is a YAML fragment (0.0.2, "hello", [1, 2, 3]); a parse failure leaves the file unchanged. |
Each tool's full input schema lives in the response to
tools/list. The server also handles the standard
initialize / initialized / notifications/cancelled
lifecycle.
Format / parse / validate are not exposed as MCP tools today —
they're available via the noya-cli
binaries (noyafmt, noyavalidate) and the
noyalib library API. Promotion to
first-class MCP tools is on the v0.0.2+ roadmap.
Examples
Agent-driving demos under
crates/noyalib-mcp/examples/:
| Script | What it shows |
|---|---|
handshake.sh |
initialize → tools/list smoke test. Confirms the binary speaks the protocol and announces the expected tools. |
format-call.sh |
tools/call format on a poorly-spaced document. Demonstrates that comments + indentation pass through the CST formatter unchanged. |
set-then-get.sh |
Round-trip the mutation surface: set rewrites server.port, get reads it back. Surgical edit; surrounding bytes untouched. |
chmod +x crates/noyalib-mcp/examples/*.sh
crates/noyalib-mcp/examples/handshake.sh | jq -c .
POSIX-shell only — no jq, no node dependencies. Pipe
through jq -c . if you want pretty-printed JSON responses.
Verification
The npm wrapper and the GHCR image both consume the signed binary attached to every GitHub Release. To verify the underlying binary before trusting it:
COSIGN_EXPERIMENTAL=1 cosign verify-blob \
--certificate-identity-regexp 'https://github.com/sebastienrousseau/noyalib-mcp/' \
--certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
--certificate <artefact>.pem \
--signature <artefact>.sig \
<artefact>
The npm wrapper additionally carries an npm provenance attestation:
npm view noyalib-mcp provenance
Full cookbook: pkg/VERIFY.md.
When not to use noyalib-mcp
- You don't trust your AI agent with filesystem access at all. noyalib-mcp doesn't read or write files itself — every operation takes the YAML document as a string argument and returns the result as a string. The agent decides what to do with the result. If the agent has filesystem access, it can persist the response wherever it wants.
- You need a sandboxed schema registry. noyalib-mcp accepts
schemas as inline strings in
tools/call validate; it does not fetch schemas from URLs. If your workflow needs network-resolved schemas, the agent is responsible for fetching the schema first and passing the bytes.
Compatibility
MSRV: Rust 1.75.0 stable — same floor as the core
noyalib library. The MCP wire surface is text-only JSON-RPC
and pulls no nightly-only deps. CI verifies the floor on every
PR via the Per-crate MSRV workflow job. The bump policy
lives in
doc/POLICIES.md.
Tier-1 platforms (CI-verified each PR): aarch64-apple-darwin,
x86_64-unknown-linux-gnu, x86_64-pc-windows-msvc. The
binary writes via atomic file replacement on every platform —
on Windows via MoveFileExW(MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH) semantics.
Documentation
- Engineering policies (MSRV, SemVer, security, performance, concurrency, platform support, feature flags):
doc/POLICIES.md - Security policy:
SECURITY.md - API reference: https://docs.rs/noyalib-mcp
- Tools reference (input schemas + error codes):
doc/tools-reference.md - Agent integration (Claude Desktop, Cursor, Continue.dev):
doc/agent-integration.md - MCP specification: https://modelcontextprotocol.io
- Workspace README: https://github.com/sebastienrousseau/noyalib#readme
Related MCP Servers
Sibling MCP servers by the same author — open-source, Apache-2.0 licensed, targeting banking and financial-services AI agents. noyalib-mcp complements them by giving agents lossless YAML editing for structured configuration files:
| Server | Purpose |
|---|---|
pain001-mcp |
Generate & validate ISO 20022 pain.001 payment initiation files (Customer Credit Transfer) |
bankstatementparser-mcp |
Parse bank statements (BAI2, MT940/MT942, CAMT.053, OFX, CSV) into structured transactions |
camt053-mcp |
Parse & reconcile ISO 20022 camt.053 bank-to-customer statements — CBPR+/HVPS+ ready |
acmt001-mcp |
Generate & validate ISO 20022 acmt.001 account management messages |
MCP Registry
mcp-name: io.github.sebastienrousseau/noyalib-mcp
License
Dual-licensed under Apache 2.0 or MIT, at your option.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。