acf.search
Full-text search over the entire ACF® corpus — principles, autonomy levels, dimensions, DDAO, fiches, regulatory guides, glossary, whitepaper. Returns a ranked list of canonical URIs to read next.
acf.search does not rewrite, summarise or guess — it ranks acf://… URIs that a follow-up call will read.When to use
Use this tool when the agent has to answer an operational or regulatory question and does not yet know which ACF® resource to cite. The query can be a technical keyword (“kill switch”), a business question (“who signs the go-live?”) or an external reference (“GDPR Art. 35”). The output gives the candidate URIs ranked by relevance, not their content.
Scoping step only: chain with acf.fiche.lookup, acf.regulation.article or a resources/read call to fetch the signed content before replying to the user. The lunr score is weighted to promote framework content (principles, levels, dimensions) above glossary synonyms.
Input parameters
Four simple fields. The query is normalised (diacritics stripped, lower-cased) before lunr indexing.
querystring (1-200)requiredscope"all" | "framework" | "fiche" | "guide" | "whitepaper" | "glossary"default: "all"locale"en" | "fr"default: "en"limitinteger (1-20)default: 10Output schema
A list of hits ranked by descending score, plus the signed footer identifying the version of the corpus queried.
querystringscopestringlocale"en" | "fr"hits{ uri, title, snippet, score, category, locale }[]doctrine_versionstringdoctrine_hashstringdoctrine_signaturestringdoctrine_archive_urlstringgenerated_atstring (ISO-8601)disclaimerstringExample call
The agent searches for kill-switch-related resources while preparing a DORA audit reply:
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
const transport = new StdioClientTransport({
command: "npx",
args: ["-y", "acf-mcp"],
});
const client = new Client({ name: "demo", version: "1.0" }, {});
await client.connect(transport);
const result = await client.callTool({
name: "acf.search",
arguments: {
query: "kill switch escalation thresholds",
scope: "all",
locale: "en",
limit: 5,
},
});
console.log(JSON.stringify(result.content, null, 2));Response
{
"query": "kill switch escalation thresholds",
"scope": "all",
"locale": "en",
"hits": [
{
"uri": "acf://fiche/ACF-06",
"title": "ACF-06 — Kill switch and degraded modes",
"snippet": "Defines the mandatory shutdown paths, the escalation thresholds that fire them, and the quarterly test cadence required for any N2+ agent.",
"score": 8.42,
"category": "fiche",
"locale": "en"
},
{
"uri": "acf://framework/principle/P-04",
"title": "Principle P-04 — Reversibility",
"snippet": "Every autonomous decision must remain reversible by a human operator within a bounded recovery window.",
"score": 6.18,
"category": "principle",
"locale": "en"
},
{
"uri": "acf://framework/autonomy-level/N2",
"title": "Autonomy level N2 — Supervised autonomy",
"snippet": "The agent decides and executes on its own; the DDAO sets escalation thresholds, a kill switch, and a signed decision register.",
"score": 5.71,
"category": "autonomy_level",
"locale": "en"
},
{
"uri": "acf://fiche/ACF-08",
"title": "ACF-08 — Signed decision register",
"snippet": "Every escalation event is logged in the signed register with the trigger threshold that fired it.",
"score": 4.92,
"category": "fiche",
"locale": "en"
},
{
"uri": "acf://glossary/kill%20switch",
"title": "kill switch",
"snippet": "Mandatory shutdown path that any DDAO can fire at any time, without prior sign-off, to stop an agent.",
"score": 3.65,
"category": "glossary",
"locale": "en"
}
],
"doctrine_version": "ACF framework v1.0 / rules 2026-06",
"doctrine_hash": "sha256:bf0b6d8e4731ebdc58f6d6338702c5b74af47874cf0ad3dc958cde5c5b30b9dc",
"doctrine_signature": "ed25519:…",
"doctrine_archive_url": "https://acfstandard.io/doctrine/v1.0/archive.json",
"generated_at": "2026-06-14T11:47:22.318Z",
"disclaimer": "Search results rank candidate resources by relevance — read the cited resources before quoting them."
}Common errors
InvalidEnumValue— scope receives an out-of-list value (e.g. scope: "fiches" plural). Fix to one of the six canonical values.QueryTooLong— query > 200 chars. acf.search is built for keywords, not full paragraphs — boil the intent down to a few tokens.EmptyHits— no result clears the relevance threshold. Broaden scope to "all", drop special characters or rephrase.
Related tools
acf.fiche.lookup— fetch the signed content of an ACF® fiche candidate identified by acf.search.acf.regulation.article— fetch the verified text of a regulatory article when the query points at an AI Act, GDPR, DORA, NIS2 or ISO 42001 guide.acf.classify-agent— when the search ends up needing an agent qualification, switch to the dedicated REASON tool.