@makerchecker/connector-claude-agent
v1.2.0
Published
MakerChecker connector for the Claude Agent SDK that wraps a custom tool so every invocation runs a deny-by-default governance check and records to the hash-chained audit log.
Readme
🔗 @makerchecker/connector-claude-agent
Put a governance gate in front of every Claude Agent SDK tool call.
Wrap a Claude Agent SDK custom tool and every invocation runs a deny-by-default check before the handler, then records an Ed25519-signed, hash-chained entry after it. Same name, description, and schema — it drops straight into your SDK MCP server.
governClaudeTool returns an SdkMcpToolDefinition with the original name, description, and input schema, so it drops into createSdkMcpServer in place of the raw tool.
Install
@anthropic-ai/claude-agent-sdk (^0.3.195) is a peer dependency.
pnpm add @makerchecker/connector-claude-agent @anthropic-ai/claude-agent-sdk zodUse
import { createSdkMcpServer } from "@anthropic-ai/claude-agent-sdk";
import { createClient } from "@makerchecker/sdk";
import { governClaudeTool } from "@makerchecker/connector-claude-agent";
import { z } from "zod";
const client = createClient({ baseUrl: "http://localhost:3000", apiKey: "mk_..." });
const { session } = await client.proxy.openSession({ label: "claude-run" });
const ingest = governClaudeTool(
client,
{ sessionId: session.id, agentName: "recon-preparer", skillRef: "csv-ingest@1" },
"csv_ingest",
"Ingest the statement CSVs",
{ statementPath: z.string() },
async (args) => ({ content: [{ type: "text", text: await readCsv(args) }] }),
);
const server = createSdkMcpServer({ name: "governed-tools", tools: [ingest] });A deny throws GovernanceDeniedError (re-exported from @makerchecker/sdk) carrying code and reason, and the handler never runs. On allow, the handler runs and its output is recorded. A throwing handler is recorded and rethrown.
API
function governClaudeTool<Schema extends AnyZodRawShape>(
client: Client,
context: GovernContext,
name: string,
description: string,
inputSchema: Schema,
handler: (args: InferShape<Schema>, extra: unknown) => Promise<ToolResult>,
): SdkMcpToolDefinition<Schema>;
interface GovernContext {
sessionId: string; // an open proxy session (client.proxy.openSession)
agentName: string; // the registered agent whose role grants are evaluated
skillRef: string; // the "name@version" of the skill this tool maps to
}License
Apache-2.0. See LICENSE.
