diff --git a/src/data/guides.ts b/src/data/guides.ts
index f60d44e..3b149b2 100644
--- a/src/data/guides.ts
+++ b/src/data/guides.ts
@@ -26,7 +26,7 @@ export const GUIDES: readonly Guide[] = [
h1: 'Screen MCP tool calls before they run',
title: 'Screen MCP tool calls before they run | agent-chaperone',
description:
- 'Put an MCP server behind a screening proxy with one change to a client configuration. What each screen asks, how to run it in shadow mode first, and what a proxy cannot see.',
+ 'Put an MCP server behind a screening proxy with one config change. What each screen asks, how to start in shadow mode, and what a proxy cannot see.',
blurb:
'One change to a client configuration puts a server behind the screen. What crosses the proxy, what the pre-call and post-result screens ask, and where a proxy stops seeing anything.',
},
@@ -35,7 +35,7 @@ export const GUIDES: readonly Guide[] = [
h1: 'Screen tool results for prompt injection before the agent reads them',
title: 'Screen tool results for prompt injection | agent-chaperone',
description:
- 'A tool result is attacker-controlled text that an agent reads as input. How the post-result screen finds hidden instructions, when it annotates rather than withholds, and what it misses.',
+ 'Tool results are text an agent reads as input. How the post-result screen finds hidden instructions, when it annotates or withholds, and what it misses.',
blurb:
'A fetched page, a file and an API response are all text somebody else wrote, and the agent reads them as input. What the screen catches, and the measured count of what it does not.',
},
@@ -44,7 +44,7 @@ export const GUIDES: readonly Guide[] = [
h1: "Screen Claude Code's built-in tools",
title: "Screen Claude Code's built-in tools | agent-chaperone",
description:
- 'Claude Code runs shell commands, file edits and web fetches outside MCP, where a proxy never sees them. The hook configuration that closes that gap, and what hooks cannot see.',
+ "Claude Code's shell commands, file edits and web fetches run outside MCP, where a proxy never sees them. The hooks that screen them, and what they miss.",
blurb:
'A proxy sees MCP traffic and nothing else. Three hooks put the same screens in front of the shell, the file edits and the fetches a client runs itself.',
},
@@ -53,7 +53,7 @@ export const GUIDES: readonly Guide[] = [
h1: 'Catch secret-leaking tool calls before they run',
title: 'Catch secret-leaking tool calls before they run | agent-chaperone',
description:
- 'A tool allow-list names tools, not what a call does with them. Deterministic secret patterns plus a semantic screen on outbound actions, and the limits of both.',
+ 'An allow-list names tools, not what a call does with them. Deterministic secret patterns plus a semantic screen on outbound calls, and the limits of both.',
blurb:
'Reading a file and posting to a URL are both ordinary. The pair is the problem, and a list of allowed tools cannot express it.',
},
@@ -62,7 +62,7 @@ export const GUIDES: readonly Guide[] = [
h1: 'Run agent-chaperone alongside ECC',
title: 'Run agent-chaperone alongside ECC | agent-chaperone',
description:
- "Add runtime screening next to ECC's hooks. What AgentShield, GateGuard and agent-chaperone each check, how their hooks run together, and how to start without blocking anything.",
+ "Runtime screening next to ECC's hooks: what AgentShield, GateGuard and agent-chaperone each check, how the hooks run together, and starting in shadow mode.",
blurb:
"ECC checks your setup and makes the agent look before it edits. This checks what each call does and what each result says, and runs next to ECC's hooks without changing them.",
},
diff --git a/src/layouts/Base.astro b/src/layouts/Base.astro
index 8fcfff4..87bfdf0 100644
--- a/src/layouts/Base.astro
+++ b/src/layouts/Base.astro
@@ -14,6 +14,14 @@ interface Props {
}
const { title, description, canonical, ogTitle, schema, robots } = Astro.props;
+// Search results cut a description at about 160 characters, and one too short
+// gets replaced with text the engine picks from the page. Either way the page
+// ships a summary nobody wrote, so a description outside the range fails the build.
+if (description.length < 25 || description.length > 160) {
+ throw new Error(
+ `The description for ${canonical} is ${description.length} characters; keep it between 25 and 160`,
+ );
+}
const year = new Date().getFullYear();
// Every page is prose that changes when the tool does, so the date a reader
// should weigh is the date of the release it describes, not the build.
diff --git a/src/pages/guides/index.astro b/src/pages/guides/index.astro
index 57509bb..11d65d9 100644
--- a/src/pages/guides/index.astro
+++ b/src/pages/guides/index.astro
@@ -6,7 +6,7 @@ import { guidesIndexSchema } from '../../data/schema';
const title = 'Guides | agent-chaperone';
const description =
- 'Setting up screening for MCP servers, for a client’s own shell and file tools, for prompt injection arriving in tool results, for secrets on their way out, and next to ECC’s hooks.';
+ 'Screening MCP servers, a client’s own shell and file tools, prompt injection in tool results and outbound secrets, and running next to ECC’s hooks.';
---
one.id === 'injecagent');
const title = 'agent-chaperone: runtime security for AI agent tool calls';
const ogTitle = 'agent-chaperone';
const description =
- 'Open-source runtime security for AI agents. Screen MCP and built-in tool calls before execution, and tool results for prompt injection before the agent reads them.';
+ 'Open-source runtime security for AI agents. Screens MCP and built-in tool calls before they run, and tool results for prompt injection before the agent acts.';
---