mcpField
S
shield

shield

Local
github.com/bolyraSecurity0Updated 4d ago

About shield

@bolyra/shield is a stdio authentication proxy that wraps MCP servers and enforces per-tool permission policies without changing server code. It verifies agent credentials, blocks replayed proofs, and emits audit receipts.

Key features

  1. 01Wrap an MCP server as a child process
  2. 02Verify credentials on tool calls
  3. 03Enforce per-tool permission policies
  4. 04Replay protection with nonce tracking
  5. 05Generate tool policies from discovered tools
  6. 06Emit audit receipts to stderr

Use cases

  1. 01Apply authentication to a local MCP server
  2. 02Restrict tool calls by permission level
  3. 03Create a deny-by-default policy from a server's tools

MCP support

Shield sits between an MCP client and server over stdio. It forwards initialization and tool-list requests, and verifies credentials and policies before forwarding tool calls.

Configuration

Local server config is the same for every client. Copy it into your client’s MCP config file.

mcp.json · Universal config
{
"mcpServers": {
"bolyra-shield": {
"command": "npx",
"args": [
"-y",
"@bolyra/shield"
]
}
}
}
Run commandnpx -y @bolyra/shield

Local servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.

Packages
npm@bolyra/shield0.1.0

Tools

No tool list yet

Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.

Details

From the project README

@bolyra/shield

Stdio MCP auth proxy. Wrap any MCP server with per-tool permission enforcement, replay protection, and audit receipts. No code changes to the server.

Quick Start

npx @bolyra/shield --server "npx @modelcontextprotocol/server-filesystem /tmp" --dev

Shield spawns the target server as a child process, intercepts tools/call requests, verifies agent credentials, and enforces tool policies before forwarding.

Config

Create shield.yaml:

devMode: true
defaultDeny: true

nonce:
  store: memory
  maxProofAge: 300

receipts:
  enabled: true
  output: stderr

tools:
  read_file:
    requireBitmask: 1    # READ_DATA
  write_file:
    requireBitmask: 2    # WRITE_DATA
  delete_file:
    requireBitmask: 2    # WRITE_DATA

Then:

npx @bolyra/shield --server "node my-server.js" --config shield.yaml

Default Deny

By default, tools without a policy entry are allowed through (only authentication is checked). Set defaultDeny: true to reject any tools/call for tool names not listed in the tools: map.

Learn Mode

Don't write the config by hand — generate a safe starting point from the server's own tool list:

npx @bolyra/shield --learn --server "node my-server.js"

Learn mode spawns the server, performs the MCP handshake (initialize → notifications/initialized → tools/list, following pagination), then writes shield.yaml (or the --config path) with:

  • defaultDeny: true — anything the server adds later is rejected until you allow it
  • every discovered tool at requireBitmask: 1 (READ_DATA) — the least-privilege floor
  • a _generated provenance block (source command + timestamp)

It never overwrites an existing config file, caps pagination at 50 pages, and times out after 30 seconds. The output is a starting point: review each tool and raise its requireBitmask (e.g. write_file → 2) before production use.

How It Works

Agent ←stdin/stdout→ Shield ←stdin/stdout→ MCP Server
                       │
                 verifyBundle()
                 checkToolPolicy()
                 nonceStore.markIfFresh()
                 emitReceipt()
  • initialize, tools/list, ping — forwarded without auth
  • tools/call — proof extracted from params._meta.bolyra, verified, policy checked, then forwarded or rejected
  • Receipts emitted to stderr (stdout is the MCP transport)

Permission Bitmask

BitPermission
0READ_DATA
1WRITE_DATA
2FINANCIAL_SMALL
3FINANCIAL_MEDIUM
4FINANCIAL_UNLIMITED
5SIGN_ON_BEHALF
6SUB_DELEGATE
7ACCESS_PII

Shield vs Gateway

ShieldGateway
TransportstdioHTTP
Use caseLocal MCP servers (Claude Desktop, Cursor)Remote/networked MCP servers
How it wrapsSpawns child processReverse proxy
Proof sourceparams._meta.bolyraAuthorization: Bolyra <base64> header
Receiptsstderrstdout/file/webhook

Both use the same verifyBundle() and checkToolPolicy() from @bolyra/mcp.

Library Usage

import { createShield, loadShieldConfig } from '@bolyra/shield';

const config = loadShieldConfig('./shield.yaml');
const { child, stop } = createShield(config);

Links

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.