
Research
/Security News
Malicious Chrome and Firefox Extensions Steal Crypto Traders’ Session and Wallet Data
Malicious Chrome and Firefox extensions target Axiom Trade and Padre users, stealing session tokens and wallet data.
@bolyra/mcp
Advanced tools
Bolyra ZKP authentication middleware for Model Context Protocol (MCP) servers — adds mutual zero-knowledge proof of human-delegated agent identity to any MCP server, over stdio or HTTP.
Bolyra ZKP authentication middleware for Model Context Protocol servers.
Adds a mutual zero-knowledge proof of human-delegated agent identity to any MCP server, over stdio or HTTP. Drop-in: one wrapper line, no changes to your tool handlers.
MCP servers today have no caller-identity story for stdio (the trust boundary is "whoever spawned the process") and an under-adopted OAuth 2.1 story for HTTP. Either way, an MCP server cannot answer:
Bolyra answers all three with a single Groth16 mutual handshake (~100ms server-side).
| Transport | Where the proof lives | Spec alignment |
|---|---|---|
| HTTP / SSE / Streamable-HTTP | Authorization: Bolyra <base64-bundle> | OAuth 2.1 resource-server pattern, custom auth scheme per RFC 7235 |
| stdio | params._meta.bolyra | Spec defines no stdio auth; _meta is the only protocol-level surface |
Both reduce to the same BolyraAuthContext on the request. Tool handlers don't care which transport delivered it.
npm install @bolyra/mcp @bolyra/sdk @modelcontextprotocol/sdk
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { withBolyraAuthStdio } from '@bolyra/mcp';
import { z } from 'zod';
const server = new McpServer({ name: 'fs-server', version: '1.0.0' });
// Register tools as usual
server.registerTool(
'read_file',
{ description: 'Read a file', inputSchema: z.object({ path: z.string() }) },
async ({ path }) => ({ content: [{ type: 'text', text: await readFile(path) }] }),
);
// Then wrap with Bolyra (BEFORE connecting the transport)
withBolyraAuthStdio(server, {
resolveCredential: async (commitment) => myRegistry.get(commitment),
toolPolicy: {
read_file: 0b01n, // requires READ_DATA bit
write_file: 0b10n, // requires WRITE_DATA bit
},
});
await server.connect(new StdioServerTransport());
Calls without a valid proof bundle in params._meta.bolyra get back:
{ "isError": true, "content": [{ "type": "text", "text": "Bolyra auth required: missing proof bundle in params._meta.bolyra" }] }
import express from 'express';
import { bolyraAuthMiddleware } from '@bolyra/mcp';
import { createMyMcpHttpHandler } from './my-mcp-http';
const app = express();
app.use(express.json());
app.use('/mcp', bolyraAuthMiddleware({
resolveCredential: async (commitment) => myRegistry.get(commitment),
toolPolicy: { read_file: 0b01n, write_file: 0b10n },
}));
app.use('/mcp', createMyMcpHttpHandler());
app.listen(3000);
Discovery requests (initialize, tools/list) pass through unauthenticated, matching how OAuth resource servers expose .well-known/* without auth. Only tools/call is gated.
import { attachBolyraProof } from '@bolyra/mcp';
import { createHumanIdentity, createAgentCredential } from '@bolyra/sdk';
const human = await createHumanIdentity(mySecret);
const credential = await createAgentCredential(human, /* ... */);
const auth = await attachBolyraProof(human, credential);
// auth.headers.Authorization → "Bolyra eyJ2I..."
// auth.meta.bolyra → { v: 1, humanProof, agentProof, nonce, credentialCommitment }
// Stdio:
await client.callTool({ name: 'read_file', arguments: { path: '...' }, _meta: auth.meta });
// HTTP:
await fetch('/mcp', { headers: { ...auth.headers, 'content-type': 'application/json' }, ... });
interface BolyraMcpConfig {
network?: string; // default 'base-sepolia' — only affects DID format
minScore?: number; // default 70 — score floor for verified=true
maxProofAge?: number; // default 300s — nonce freshness window
toolPolicy?: ToolPermissionPolicy; // tool name → required permission bitmask
resolveCredential: (commitment: string) => Promise<AgentCredential | null>;
sdkConfig?: BolyraConfig; // rpc/registry/circuit dirs
}
The HTTP variant also accepts authScheme (default "Bolyra").
A single mutual handshake verification is dominated by the Groth16 verify cost (~5–10ms native, ~30–60ms snarkjs). The proof generation itself is client-side (~100ms with rapidsnark). End-to-end overhead per tool call: ~110ms p50 with the full pipeline, comfortably under the perceptible-latency floor for interactive agent workflows.
MIT.
FAQs
Gate MCP tool calls so only authorized agents can call sensitive tools — Bolyra ZKP authentication middleware for Model Context Protocol servers, over stdio or HTTP.
The npm package @bolyra/mcp receives a total of 52 weekly downloads. As such, @bolyra/mcp popularity was classified as not popular.
We found that @bolyra/mcp demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Research
/Security News
Malicious Chrome and Firefox extensions target Axiom Trade and Padre users, stealing session tokens and wallet data.

Security News
GPT-6 Astra hits 100% on ExploitBench and finds zero-days autonomously, while independent tests reveal scope violations and monitoring gaps.

Product
Socket can now send alerts and supply chain attack notifications to Microsoft Teams, with filters that route the right updates to each channel.