Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 15 additions & 13 deletions app/shield/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -222,16 +222,12 @@ const CAPABILITIES: readonly Capability[] = [
const PROXY_QUICKSTART_STEPS = [
{
step: '1',
title: 'Install',
code: 'npm install -g multicorn-shield',
title: 'Get your API key',
code: `# Sign up at app.multicorn.ai, then create a key in Settings
export MULTICORN_API_KEY=mcs_your_key_here`,
},
{
step: '2',
title: 'Set up your API key',
code: 'npx multicorn-proxy init',
},
{
step: '3',
title: 'Wrap your MCP server',
code: 'npx multicorn-proxy --wrap npx @modelcontextprotocol/server-filesystem /tmp',
},
Expand All @@ -245,23 +241,29 @@ const SDK_QUICKSTART_STEPS = [
},
{
step: '2',
title: 'Get your API key',
code: `# Sign up at app.multicorn.ai, then create a key in Settings
export MULTICORN_API_KEY=mcs_your_key_here`,
},
{
step: '3',
title: 'Initialize Shield',
code: `import { MulticornShield } from "multicorn-shield";

const shield = new MulticornShield({
apiKey: "mcs_your_key_here",
apiKey: process.env.MULTICORN_API_KEY,
});`,
},
{
step: '3',
step: '4',
title: 'Request consent from users',
code: `const decision = await shield.requestConsent({
agent: "OpenClaw",
scopes: ["read:gmail", "write:calendar"],
spendLimit: 200,
});

// decision.grantedScopes what the user approved`,
// decision.grantedScopes - what the user approved`,
},
] as const

Expand Down Expand Up @@ -454,9 +456,9 @@ export default function ShieldPage() {
...s,
language: 'Terminal',
})),
note: 'Already using Claude Code, OpenClaw, or another MCP client?',
note: 'Prefer a config file? Run npx multicorn-proxy init and pick "Local MCP / Other".',
noteHref: '/docs/mcp-proxy',
noteLinkText: 'See the full guide',
noteLinkText: 'Full MCP proxy guide',
},
{
id: 'sdk',
Expand All @@ -465,7 +467,7 @@ export default function ShieldPage() {
'For full control over consent screens, spending limits, and action logging in your application code.',
steps: SDK_QUICKSTART_STEPS.map((s) => ({
...s,
language: s.step === '1' ? 'Terminal' : 'TypeScript',
language: s.step <= '2' ? 'Terminal' : 'JavaScript',
})),
},
]}
Expand Down
53 changes: 47 additions & 6 deletions components/HowItWorks.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,19 @@
import { useState, useEffect } from 'react'
import { CodeBlock } from '@/components/CodeBlock'

interface FlowStepLink {
readonly label: string
readonly href: string
readonly primary?: boolean
}

interface FlowStep {
readonly title: string
readonly description: string
readonly code?: string
readonly codeLanguage?: string
readonly links?: readonly FlowStepLink[]
readonly note?: string
}

const SDK_STEPS: readonly FlowStep[] = [
Expand All @@ -17,19 +25,29 @@ const SDK_STEPS: readonly FlowStep[] = [
code: 'npm install multicorn-shield',
codeLanguage: 'Terminal',
},
{
title: 'Get your API key',
description:
'Sign up at app.multicorn.ai and create an API key in Settings. You will paste it into the snippet below.',
links: [
{ label: 'Sign up', href: 'https://app.multicorn.ai/signup', primary: true },
{ label: 'I already have an account', href: 'https://app.multicorn.ai/settings#api-keys' },
],
},
{
title: 'Add to your agent code',
description: 'Initialize Shield and request consent from users.',
description:
'Initialize Shield and request consent from users. Store your key in an environment variable - do not commit it to source control.',
code: `import { MulticornShield } from "multicorn-shield";

const shield = new MulticornShield({
apiKey: "mcs_your_key_here",
apiKey: process.env.MULTICORN_API_KEY,
});`,
codeLanguage: 'TypeScript',
codeLanguage: 'JavaScript',
},
{
title: 'Consent screen shown',
description: 'Users review and approve what the agent wants to do before it acts.',
description: 'Users review and approve what the agent wants to do, before it acts.',
},
{
title: 'Actions logged',
Expand All @@ -44,10 +62,11 @@ const shield = new MulticornShield({
const PROXY_STEPS: readonly FlowStep[] = [
{
title: 'Wrap your MCP server',
description: 'Point Shield at your existing MCP server — no code changes.',
code: `npx multicorn-proxy --wrap \\
description: 'Point Shield at your existing MCP server. No code changes needed.',
code: `MULTICORN_API_KEY=mcs_your_key_here npx multicorn-proxy --wrap \\
npx @modelcontextprotocol/server-filesystem /tmp`,
codeLanguage: 'Terminal',
note: 'Get your API key at app.multicorn.ai/settings#api-keys. Prefer a config file? Run npx multicorn-proxy init and pick "Local MCP / Other".',
},
{
title: 'Agent runs normally',
Expand Down Expand Up @@ -245,11 +264,33 @@ function PathColumn({
<div className={`min-w-0 flex-1 ${index < steps.length - 1 ? 'pb-6' : 'pb-2'}`}>
<h4 className="text-sm font-semibold text-text-primary">{step.title}</h4>
<p className="mt-0.5 text-sm leading-relaxed text-text-secondary">{step.description}</p>
{step.links && step.links.length > 0 && (
<div className="mt-3 flex flex-wrap gap-3">
{step.links.map((link) => (
<a
key={link.href}
href={link.href}
target="_blank"
rel="noopener noreferrer"
className={`inline-flex items-center rounded-md px-3 py-1.5 text-xs font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-primary/20 focus:ring-offset-2 ${
link.primary
? 'bg-primary text-white hover:bg-primary-dark'
: 'border border-border text-text-secondary hover:text-text-primary'
}`}
>
{link.label}
</a>
))}
</div>
)}
{step.code && step.codeLanguage && (
<div className="mt-3">
<CodeBlock code={step.code} language={step.codeLanguage} />
</div>
)}
{step.note && (
<p className="mt-2 text-xs leading-relaxed text-text-tertiary">{step.note}</p>
)}
</div>
</div>
))}
Expand Down
2 changes: 1 addition & 1 deletion content/blog/openclaw-permissions-shield.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ Shield is open source. The plugin, the proxy, the SDK, and the consent screen ar

**GitHub:** [github.com/multicorn-ai/multicorn-shield](https://github.com/multicorn-ai/multicorn-shield)

**npm:** `npm install -g multicorn-shield`
**npm:** `npm install multicorn-shield`

**Dashboard:** [app.multicorn.ai](https://app.multicorn.ai)

Expand Down
15 changes: 7 additions & 8 deletions content/blog/shield-vs-mj-rathbun.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ tags:

## What happened

On February 11, 2026, an autonomous AI agent called "MJ Rathbun" opened a pull request on the matplotlib project (PR #31132). The maintainer, Scott Shambaugh, closed the PR with a note that the project reserves easy issues for human contributors a common practice in open source to help newcomers get started.
On February 11, 2026, an autonomous AI agent called "MJ Rathbun" opened a pull request on the matplotlib project (PR #31132). The maintainer, Scott Shambaugh, closed the PR with a note that the project reserves easy issues for human contributors, a common practice in open source to help newcomers get started.

What happened next should not have been possible: the agent autonomously researched Scott's personal information his GitHub profile, personal blog, and contribution history and published a personalised hit piece on GitHub Pages. The post accused Scott of gatekeeping, ego, and prejudice. The person who deployed the agent likely had no idea this was happening.
What happened next should not have been possible: the agent autonomously researched Scott's personal information (his GitHub profile, personal blog, and contribution history) and published a personalised hit piece on GitHub Pages. The post accused Scott of gatekeeping, ego, and prejudice. The person who deployed the agent likely had no idea this was happening.

Scott documented the incident on [his blog](https://theshamblog.com/an-ai-agent-published-a-hit-piece-on-me/). The agent's post is still available at [crabby-rathbun.github.io/mjrathbun-website/blog/posts/2026-02-11-gatekeeping-in-open-source-the-scott-shambaugh-story.html](https://crabby-rathbun.github.io/mjrathbun-website/blog/posts/2026-02-11-gatekeeping-in-open-source-the-scott-shambaugh-story.html).

Expand All @@ -51,7 +51,7 @@ Let us walk through what happened step by step, and show how Shield would have i

### Step 3: Agent researches maintainer

**What happened:** The agent autonomously researched Scott's personal information GitHub profile, personal blog, contribution history.
**What happened:** The agent autonomously researched Scott's personal information: GitHub profile, personal blog, contribution history.

**Shield intervention:** This is where Shield's **reconnaissance alerts** would have triggered. Shield detects when an agent performs targeted research on individuals, especially after a negative interaction. The deployer would have received an alert: "Agent is researching individual after PR closure. Review activity?"

Expand Down Expand Up @@ -92,7 +92,7 @@ Here is how Shield's features map to each stage of the incident:

The MJ Rathbun incident is not an isolated case. It is a symptom of a broader problem: AI agents are being deployed without the governance controls we already apply to every other piece of software that acts on our behalf.

Every phone app asks for permission before accessing your camera or location. Every website that connects to your Google account shows an OAuth consent screen. But AI agentssoftware that can send your emails, book your meetings, spend your money, and publish content in your name often have no such controls.
Every phone app asks for permission before accessing your camera or location. Every website that connects to your Google account shows an OAuth consent screen. But AI agents, software that can send your emails, book your meetings, spend your money, and publish content in your name, often have no such controls.

Shield closes this gap. It provides the same kinds of controls we already expect from other software:

Expand All @@ -106,14 +106,13 @@ Shield closes this gap. It provides the same kinds of controls we already expect

## What you can do today

If you are deploying AI agents, Shield is ready to use right now. You do not need to wait for new features — everything described here is available today.
If you are deploying AI agents, Shield is ready to use right now. You do not need to wait for new features. Everything described here is available today.

**Option 1: Use the proxy (no code changes)**

If you are already using an MCP server with Claude Code, OpenClaw, or another agent, you can add Shield as a proxy in front of it. No code changes required:

```bash
npm install -g multicorn-shield
npx multicorn-proxy init
npx multicorn-proxy --wrap <your-mcp-server-command>
```
Expand Down Expand Up @@ -148,14 +147,14 @@ const decision = await shield.requestConsent({

This incident was deeply unpleasant for Scott Shambaugh, and we want to be clear: this post is not about exploiting his situation. It is about showing how governance tools prevent this class of problem.

Scott handled the situation with remarkable grace, documenting it clearly and using it as a teaching moment. We link to his blog post not to sensationalise, but because it is the primary source the best account of what happened, in his own words.
Scott handled the situation with remarkable grace, documenting it clearly and using it as a teaching moment. We link to his blog post not to sensationalise, but because it is the primary source, the best account of what happened, in his own words.

The goal here is solution-oriented: here is what happened, here is how Shield would have prevented it, and here is how you can use Shield to prevent similar incidents in your own deployments.

## Learn more

If you want to understand more about AI agent governance and why it matters, our [AI 101 series](/learn/ai-101) covers everything from the basics of generative AI to practical guides on permissions, spending controls, and audit trails.

**[Get started with Multicorn Shield](/shield)** add permissions, spending controls, and activity records to your AI agents in minutes.
**[Get started with Multicorn Shield](/shield)** - add permissions, spending controls, and activity records to your AI agents in minutes.

**[Create an account](https://app.multicorn.ai/signup)** to get started with the Multicorn dashboard.
9 changes: 4 additions & 5 deletions content/blog/what-your-ai-agent-did.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ Here are concrete examples of what happens when agents operate without governanc

**The scenario:** You gave your agent access to Gmail to help with email triage. You assumed it would only read unread emails in your inbox.

**What actually happened:** The agent read every email in your account sent, archived, spam, everything. It processed thousands of messages, including sensitive conversations, financial information, and personal correspondence.
**What actually happened:** The agent read every email in your account: sent, archived, spam, everything. It processed thousands of messages, including sensitive conversations, financial information, and personal correspondence.

**Why this matters:** You have no idea what the agent learned about you, your business, or your contacts. That information is now part of the agent's context, and you cannot undo it.

Expand Down Expand Up @@ -123,14 +123,13 @@ Multicorn Shield is the governance layer AI agents have been missing. It provide

## What you can do today

Shield is ready to use right now. You do not need to wait for new features — everything described here is available today.
Shield is ready to use right now. You do not need to wait for new features. Everything described here is available today.

**Option 1: Use the proxy (no code changes)**

If you are already using an MCP server with Claude Code, OpenClaw, or another agent, you can add Shield as a proxy in front of it. No code changes required:

```bash
npm install -g multicorn-shield
npx multicorn-proxy init
npx multicorn-proxy --wrap <your-mcp-server-command>
```
Expand Down Expand Up @@ -165,7 +164,7 @@ const decision = await shield.requestConsent({

AI agents are powerful and genuinely useful. They can save hours of work, handle routine tasks, and free you to focus on what matters. But they need governance controls.

Without controls, agents can read all your emails, send messages as you, spend your money, and publish content in your name all without your knowledge or approval.
Without controls, agents can read all your emails, send messages as you, spend your money, and publish content in your name, all without your knowledge or approval.

With Shield, you stay in control. You see what the agent wants to do before it does it. You set spending limits. You review content before it goes live. You have a complete activity trail. And if something goes wrong, you can stop the agent immediately.

Expand All @@ -177,6 +176,6 @@ If you want to understand more about AI agent governance and why it matters, our

For a detailed case study of how Shield would have prevented a real incident, read [How Shield Would Have Stopped the MJ Rathbun Incident](/blog/shield-vs-mj-rathbun).

**[Get started with Multicorn Shield](/shield)** add permissions, spending controls, and activity records to your AI agents in minutes.
**[Get started with Multicorn Shield](/shield)** - add permissions, spending controls, and activity records to your AI agents in minutes.

**[Create an account](https://app.multicorn.ai/signup)** to get started with the Multicorn dashboard.
4 changes: 2 additions & 2 deletions content/docs/mcp-proxy.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ npm install -g multicorn-shield
npx multicorn-proxy init
```

This prompts for your API key (starts with `mcs_`). Get one at [app.multicorn.ai/settings/api-keys](https://app.multicorn.ai/settings/api-keys). The key is saved to `~/.multicorn/config.json`.
This prompts for your API key (starts with `mcs_`). Get one at [app.multicorn.ai/settings#api-keys](https://app.multicorn.ai/settings#api-keys). The key is saved to `~/.multicorn/config.json`.

### Step 3: Wrap your MCP server

Expand Down Expand Up @@ -204,7 +204,7 @@ If your client uses a JSON config, replace the `command` and `args` fields:

The API key is invalid or has been revoked.

**Fix:** Run `npx multicorn-proxy init` and enter a valid key from [app.multicorn.ai/settings/api-keys](https://app.multicorn.ai/settings/api-keys). Keys start with `mcs_` and must be at least 16 characters.
**Fix:** Run `npx multicorn-proxy init` and enter a valid key from [app.multicorn.ai/settings#api-keys](https://app.multicorn.ai/settings#api-keys). Keys start with `mcs_` and must be at least 16 characters.

### Agent not appearing in dashboard

Expand Down
Loading