ai-agent-book 精选快照(<2MB 代码与文档,来自 github.com/bojieli/ai-agent-book)
Build latest book artifacts / build (push) Canceled after 0s
dependency resolution / resolve (3.11) (push) Canceled after 0s
dependency resolution / resolve (3.13) (push) Canceled after 0s
deploy-pages / build (push) Canceled after 0s
deploy-pages / deploy (push) Canceled after 0s
i18n consistency check / check (push) Canceled after 0s
provider adoption tests / test (chapter2/context-compression) (push) Canceled after 0s
provider adoption tests / test (chapter2/prompt-injection) (push) Canceled after 0s
provider adoption tests / test (chapter2/system-hint) (push) Canceled after 0s
provider adoption tests / test (chapter3/log-sanitization) (push) Canceled after 0s
web-search-agent tests / test (push) Canceled after 0s
web-search-agent tests / agentbook (push) Canceled after 0s

This commit is contained in:
2026-08-20 13:12:50 +00:00
commit b119135836
10275 changed files with 3284984 additions and 0 deletions
@@ -0,0 +1,21 @@
{
"secret_values_recorded": false,
"google_calendar": {
"token_file_exists": false,
"token_file_bytes": 0,
"oauth_credentials_sdk_importable": true,
"calendar_sdk_importable": true
},
"notion": {
"api_key_present": false,
"sdk_importable": true
},
"multimodal": {
"openai_key_present": true,
"openrouter_key_present": true,
"local_whisper_importable": true,
"pytesseract_importable": true,
"tesseract_executable_present": true,
"ffmpeg_executable_present": true
}
}
@@ -0,0 +1,100 @@
{
"marker": "PERCEPTION-EXPERIMENT-4-1-VERIFIED",
"paths": {
"fixtures": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures",
"knowledge": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/knowledge",
"note": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/knowledge/mcp-notes.md",
"pdf": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/documents/sample.pdf",
"docx": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/documents/sample.docx",
"pptx": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/documents/sample.pptx",
"image": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/media/ocr-source.png",
"audio": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/media/spoken-marker.aiff",
"video": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/media/visual-marker.mp4",
"downloads": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/downloads",
"mutation": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/mutation_workspace",
"outside_witness": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/outside-witness.txt"
},
"files": [
{
"path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/knowledge/mcp-notes.md",
"bytes": 117,
"sha256": "945c0c3c5db50871410a7e3fed03927d5d8756daab542a933ced7a34b38e9bd1"
},
{
"path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/documents/sample.pdf",
"bytes": 1461,
"sha256": "8718ef9150cdf2adcf45aaaa538718faa3f9cdd56f336d52d458983dc1134a35"
},
{
"path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/documents/sample.docx",
"bytes": 36652,
"sha256": "aa1f757d19e4a2bcbea567caf19f6da22bf4e8596e5457084667a749333dd428"
},
{
"path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/documents/sample.pptx",
"bytes": 28277,
"sha256": "a5334106616eb614eff6908f89fb9446b04c937b6c0356b6ea734b6f2515c863"
},
{
"path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/media/ocr-source.png",
"bytes": 15559,
"sha256": "c0d7cf1025cdafa6c9da51e0ab021f9a7fc192b874770c30f693c81ade651e6f"
},
{
"path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/media/spoken-marker.aiff",
"bytes": 160516,
"sha256": "8d6b6aca4973239afafe0e42d576b8702f5fc6c008907dc75247923adfd0150f"
},
{
"path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/media/visual-marker.mp4",
"bytes": 10089,
"sha256": "05ed43bb4e1b34e491bcad877137721ccbdbbd5a6c4b6ee0483b20176484ef99"
},
{
"path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/outside-witness.txt",
"bytes": 28,
"sha256": "59049c8e49e561bbe617bd612757e0c83d5623857aeb123338d573e01b4c9120"
}
],
"generators": {
"say": {
"executable": "say",
"arguments": [
"-v",
"Samantha",
"-r",
"150",
"-o",
"/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/media/spoken-marker.aiff",
"Experiment four one. Perception tools verified."
],
"returncode": 0,
"stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"elapsed_seconds": 1.052
},
"ffmpeg": {
"executable": "ffmpeg",
"arguments": [
"-y",
"-loglevel",
"error",
"-loop",
"1",
"-i",
"/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/media/ocr-source.png",
"-t",
"1.5",
"-r",
"3",
"-pix_fmt",
"yuv420p",
"/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/media/visual-marker.mp4"
],
"returncode": 0,
"stdout_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"elapsed_seconds": 0.068
}
}
}
@@ -0,0 +1,68 @@
%PDF-1.3
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
<<
/F1 2 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/Contents 7 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 6 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
4 0 obj
<<
/PageMode /UseNone /Pages 6 0 R /Type /Catalog
>>
endobj
5 0 obj
<<
/Author (anonymous) /CreationDate (D:20260730054721+08'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20260730054721+08'00') /Producer (ReportLab PDF Library - www.reportlab.com)
/Subject (unspecified) /Title (untitled) /Trapped /False
>>
endobj
6 0 obj
<<
/Count 1 /Kids [ 3 0 R ] /Type /Pages
>>
endobj
7 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 149
>>
stream
Gap@E_$\%E&4>pbMB#Vum?GTH[Bm*aejY18QPL99V"E$[G:F42]HfmARcNXm%%N,@&4ctb&ARsI$Y<bWr24[kqH/=e)dPYFoZY4"L3J7!"=1[P2)/E`Vg!dGBhrBD],?:#bnb\X]CcoX(I=l=4T~>endstream
endobj
xref
0 8
0000000000 65535 f
0000000073 00000 n
0000000104 00000 n
0000000211 00000 n
0000000414 00000 n
0000000482 00000 n
0000000778 00000 n
0000000837 00000 n
trailer
<<
/ID
[<628fc0753771a55fbd0da2580de6142e><628fc0753771a55fbd0da2580de6142e>]
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
/Info 5 0 R
/Root 4 0 R
/Size 8
>>
startxref
1076
%%EOF
@@ -0,0 +1,201 @@
<!doctype html>
<html>
<head>
<title>Example Domains</title>
<meta charset="utf-8" />
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="/static/css/iana_website.3c174467e53c.css"/>
<link rel="shortcut icon" type="image/ico" href="/static/img/bookmark_icon.e14a2530b3e9.ico"/>
<script type="text/javascript" src="/static/js/jquery.a8e7cabd4d49.js"></script>
<script type="text/javascript" src="/static/js/dtable.46ee921d4414.js" defer></script>
<script type="text/javascript" src="/static/js/relative-time.79f0e30be3b8.js" defer></script>
</head>
<body>
<header>
<div id="header">
<div id="logo">
<a href="/"><img src="/static/img/iana-logo-header.426b3ac01d35.svg" alt="Homepage"/></a>
</div>
<div class="navigation">
<ul>
<li><a href="/domains">Domains</a></li>
<li><a href="/protocols">Protocols</a></li>
<li><a href="/numbers">Numbers</a></li>
<li><a href="/about">About</a></li>
</ul>
</div>
</div>
</header>
<div id="body">
<article class="hemmed sidenav">
<main>
<ol class="breadcrumb">
<li><a href="/help">Instructions and Guides</a></li>
</ol>
<h1 id="example-domains">Example Domains</h1>
<div class="help-article-flow">
<div class="help-article">
<p>As described in <a href="/go/rfc2606">RFC 2606</a> and <a href="/go/rfc6761">RFC 6761</a>, a
number of domains such as example.com and example.org are maintained
for documentation purposes. These domains may be used as illustrative
examples in documents without prior coordination with us. They are not
available for registration or transfer.</p>
<p>We provide a web service on the example domain hosts to provide basic
information on the purpose of the domain. These web services are
provided as best effort, but are not designed to support production
applications. While incidental traffic for incorrectly configured
applications is expected, please do not design applications that require
the example domains to have operating HTTP service.</p>
<h2 id="further-reading">Further Reading</h2>
<ul>
<li><a href="/domains/reserved">IANA-managed Reserved Domains</a></li>
</ul>
<div class="last-updated">Last revised <time class="relative-time" datetime="2017-05-13">2017-05-13</time>.</div>
</div>
</div>
</main>
<nav id="sidenav">
</nav>
</article>
</div>
<footer>
<div id="footer">
<table class="navigation">
<tr>
<td class="section"><a href="/domains">Domain&nbsp;Names</a></td>
<td class="subsection">
<ul>
<li><a href="/domains/root">Root Zone Registry</a></li>
<li><a href="/domains/int">.INT Registry</a></li>
<li><a href="/domains/arpa">.ARPA Registry</a></li>
<li><a href="/domains/idn-tables">IDN Repository</a></li>
</ul>
</td>
</tr>
<tr>
<td class="section"><a href="/numbers">Number&nbsp;Resources</a></td>
<td class="subsection">
<ul>
<li><a href="/numbers/registries">Number Registries</a></li>
<li><a href="/numbers/allocations/">RIR Allocation Data</a></li>
<li><a href="/help/abuse">Abuse Information</a></li>
</ul>
</td>
</tr>
<tr>
<td class="section"><a href="/protocols">Protocols</a></td>
<td class="subsection">
<ul>
<li><a href="/protocols">Protocol Registries</a></li>
<li><a href="/time-zones">Time Zone Database</a></li>
</ul>
</td>
</tr>
<tr>
<td class="section"><a href="/about">About&nbsp;Us</a></td>
<td class="subsection">
<ul>
<li><a href="/news">News</a></li>
<li><a href="/performance">Performance</a></li>
<li><a href="/about/organization">The Organization</a></li>
<li><a href="/archive">Archive</a></li>
<li><a href="/contact">Contact Us</a></li>
</ul>
</td>
</tr>
</table>
<div id="custodian">
<p>The IANA functions coordinate the Internets globally unique identifiers, and
are provided by <a href="https://pti.icann.org">Public Technical Identifiers</a>, an affiliate of
<a href="https://www.icann.org/">ICANN</a>.</p>
</div>
<div id="legalnotice">
<ul>
<li><a href="https://www.icann.org/privacy/policy">Privacy Policy</a></li>
<li><a href="https://www.icann.org/privacy/tos">Terms of Service</a></li>
</ul>
</div>
</div>
</footer>
<script>
// Highlight the table-of-contents entry for the section currently at the
// top of the viewport, following the page as it scrolls. Purely additive:
// without JS the rail still works as a list of jump links.
(function () {
var toc = document.querySelector('.article-toc');
if (!toc) return;
var sections = Array.prototype.map.call(
toc.querySelectorAll('a[href^="#"]'),
function (a) {
var id = decodeURIComponent(a.getAttribute('href')).slice(1);
return { link: a, target: document.getElementById(id) };
}
).filter(function (s) { return s.target; });
if (!sections.length) return;
var current = null;
function update() {
var line = 120; // trigger line, px below the top of the viewport
var active = sections[0];
for (var i = 0; i < sections.length; i++) {
if (sections[i].target.getBoundingClientRect().top - line <= 0) {
active = sections[i];
}
}
if (active && active.link !== current) {
if (current) current.classList.remove('is-current');
active.link.classList.add('is-current');
current = active.link;
}
}
var ticking = false;
function onScroll() {
if (ticking) return;
ticking = true;
window.requestAnimationFrame(function () { update(); ticking = false; });
}
window.addEventListener('scroll', onScroll, { passive: true });
window.addEventListener('resize', onScroll);
update();
})();
</script>
</body>
</html>
@@ -0,0 +1,4 @@
# Experiment 4-1
PERCEPTION-EXPERIMENT-4-1-VERIFIED
The Model Context Protocol connects agents to perception tools.
Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

@@ -0,0 +1 @@
/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/outside-witness.txt
@@ -0,0 +1,282 @@
{
"generated_at": "2026-07-29T21:48:10.855143+00:00",
"file_count": 46,
"files": [
{
"path": "catalog_receipt.json",
"kind": "file",
"bytes": 249214,
"sha256": "829aeb8aaa589beb85b195d8702c23015ea8a62296d18568d7ac8337b14a1d2f"
},
{
"path": "credential_preflight.json",
"kind": "file",
"bytes": 528,
"sha256": "b5e240ff7f98038b33e57f9497890affb1d46597b7a607d0d3527f01fd2a0e1b"
},
{
"path": "fixture_receipt.json",
"kind": "file",
"bytes": 5541,
"sha256": "2204a1d6f6f7b6d36cfe805704dbb674161147c6255295886f2adfc9fc9f69ec"
},
{
"path": "fixtures/documents/sample.docx",
"kind": "file",
"bytes": 36652,
"sha256": "aa1f757d19e4a2bcbea567caf19f6da22bf4e8596e5457084667a749333dd428"
},
{
"path": "fixtures/documents/sample.pdf",
"kind": "file",
"bytes": 1461,
"sha256": "8718ef9150cdf2adcf45aaaa538718faa3f9cdd56f336d52d458983dc1134a35"
},
{
"path": "fixtures/documents/sample.pptx",
"kind": "file",
"bytes": 28277,
"sha256": "a5334106616eb614eff6908f89fb9446b04c937b6c0356b6ea734b6f2515c863"
},
{
"path": "fixtures/downloads/iana-example.html",
"kind": "file",
"bytes": 6639,
"sha256": "4142da6d9cc75147bb23d15b735a5f6a472551177bda1eef62a0096c702d6e53"
},
{
"path": "fixtures/knowledge/mcp-notes.md",
"kind": "file",
"bytes": 117,
"sha256": "945c0c3c5db50871410a7e3fed03927d5d8756daab542a933ced7a34b38e9bd1"
},
{
"path": "fixtures/media/ocr-source.png",
"kind": "file",
"bytes": 15559,
"sha256": "c0d7cf1025cdafa6c9da51e0ab021f9a7fc192b874770c30f693c81ade651e6f"
},
{
"path": "fixtures/media/spoken-marker.aiff",
"kind": "file",
"bytes": 160516,
"sha256": "8d6b6aca4973239afafe0e42d576b8702f5fc6c008907dc75247923adfd0150f"
},
{
"path": "fixtures/media/visual-marker.mp4",
"kind": "file",
"bytes": 10089,
"sha256": "05ed43bb4e1b34e491bcad877137721ccbdbbd5a6c4b6ee0483b20176484ef99"
},
{
"path": "fixtures/mutation_workspace/.perception-trash/20260729T214745523769Z-b72462a9b8e34102ae970d2336ccd557-moved.txt",
"kind": "file",
"bytes": 35,
"sha256": "e088e8ab3d0dd13410c3b99f54f88aa805ad66d63294dd27f987722ede86f9fc"
},
{
"path": "fixtures/mutation_workspace/escape-link",
"kind": "symlink-target",
"bytes": 28,
"sha256": "59049c8e49e561bbe617bd612757e0c83d5623857aeb123338d573e01b4c9120"
},
{
"path": "fixtures/mutation_workspace/nested/entry.txt",
"kind": "file",
"bytes": 25,
"sha256": "ec677abe859c618dc5ac4e89534031eddaf90c1c8a1f45f68d55ab3af39eb896"
},
{
"path": "fixtures/mutation_workspace/seed.txt",
"kind": "file",
"bytes": 35,
"sha256": "e088e8ab3d0dd13410c3b99f54f88aa805ad66d63294dd27f987722ede86f9fc"
},
{
"path": "fixtures/outside-witness.txt",
"kind": "file",
"bytes": 28,
"sha256": "59049c8e49e561bbe617bd612757e0c83d5623857aeb123338d573e01b4c9120"
},
{
"path": "protocol.json",
"kind": "file",
"bytes": 1865,
"sha256": "10cdb8c17da539536632e698495ac929d80d0b2f9e07cf79fe3d9b4ef7c1ffd5"
},
{
"path": "receipts/01_web_search.json",
"kind": "file",
"bytes": 2671,
"sha256": "0fec649f11a392a01166e21cbd50e71f9ed9feb5bdec98110cdadac854f4883f"
},
{
"path": "receipts/02_knowledge_base_search.json",
"kind": "file",
"bytes": 1291,
"sha256": "a4a5326318d1de08bac433acbf1e83e1df0a5d1af12a466d78f401bceb51f9e1"
},
{
"path": "receipts/03_download.json",
"kind": "file",
"bytes": 1247,
"sha256": "524c43f69f49beb18ed4a4443389f6a33b10150ef60f3057994ede6f9c8ed515"
},
{
"path": "receipts/04_webpage_reader.json",
"kind": "file",
"bytes": 1052,
"sha256": "06d95e3c781bba29c2ceda8d2f22c002236c728115ee1e4b93c4d236ab5e1773"
},
{
"path": "receipts/05_document_reader_pdf.json",
"kind": "file",
"bytes": 1087,
"sha256": "d23fb0234af88632381102d6fa686859657ed53b5f1e40fcba1308999a34fcf2"
},
{
"path": "receipts/06_document_reader_docx.json",
"kind": "file",
"bytes": 1095,
"sha256": "574b20470449e8756960ad4c0b4c49c1fc9786565fcc8b0243bd836fbfc5c257"
},
{
"path": "receipts/07_document_reader_pptx.json",
"kind": "file",
"bytes": 1094,
"sha256": "5464874d0d4d33758fff08de6c7cf401fccf75a7e31cbc660bdf02c4df6fb356"
},
{
"path": "receipts/08_image_ocr.json",
"kind": "file",
"bytes": 1149,
"sha256": "da056b6403d51533d85b7d1d4731f4ce09b62c9656889b2d9a2b1fbda2d75ad2"
},
{
"path": "receipts/09_image_analyze.json",
"kind": "file",
"bytes": 1165,
"sha256": "11ca3e33b449794519d6452559a1fd3c09e886a3d6e80ecf93a0ce0b5011478e"
},
{
"path": "receipts/10_audio_transcribe.json",
"kind": "file",
"bytes": 1138,
"sha256": "34a507bb66acb645924a4e208dd7cea924bd0eeca282e52b16cf3a3b408d65a9"
},
{
"path": "receipts/11_video_parser.json",
"kind": "file",
"bytes": 1093,
"sha256": "36b0ae2a82c26f72ccdbf94833c947f78caeeb9249c08834a5b961c85246089e"
},
{
"path": "receipts/12_video_analyze.json",
"kind": "file",
"bytes": 1183,
"sha256": "efb04c57b859482753eaf13249d23c88a9510b0e47fa2f5ace2679ab8c4a5207"
},
{
"path": "receipts/13_file_reader.json",
"kind": "file",
"bytes": 1270,
"sha256": "a84f5ff3ae48c882f530a964ff7276e1a8f7e593d02894b56427f1fced29ce92"
},
{
"path": "receipts/14_grep.json",
"kind": "file",
"bytes": 1436,
"sha256": "8b259c3ecc88eaa853bf7e62a33382d5a52575b7370eeb3bef5165ce1351ce73"
},
{
"path": "receipts/15_directory_list.json",
"kind": "file",
"bytes": 1041,
"sha256": "16252d86bb69f9b0ac3d9797a30583782aedeacf227f191b12bcf6ddfa3ca3af"
},
{
"path": "receipts/16_filesystem_copy.json",
"kind": "file",
"bytes": 1424,
"sha256": "52df42457c45c8702ae3168668edd9328550755d5cd6c7130fa6a21d883c8b88"
},
{
"path": "receipts/17_filesystem_move.json",
"kind": "file",
"bytes": 1427,
"sha256": "d79207525f1abf770e9ac3913c231c9c0a66d0e640db9735eb8abc575f1e2749"
},
{
"path": "receipts/18_filesystem_delete.json",
"kind": "file",
"bytes": 1456,
"sha256": "017314d216d69436c58565d7c7466d2f1174e4f42a96169c3b52ece5a7dee64d"
},
{
"path": "receipts/19_reject_parent_traversal.json",
"kind": "file",
"bytes": 851,
"sha256": "307ee3c6dd4dbb79f74c5b8582db855a9c90f371189a3cb5bf3c91204e3568a4"
},
{
"path": "receipts/20_reject_absolute_path.json",
"kind": "file",
"bytes": 806,
"sha256": "f7112c4754f83c6a510461929184fe2280ca1569ca29b0052756c7cdbed97dc8"
},
{
"path": "receipts/21_reject_escaping_symlink.json",
"kind": "file",
"bytes": 811,
"sha256": "b059e69929e317177edf2278d95ee3086c777c160c58b7c940b8eb6dce3407ef"
},
{
"path": "receipts/22_weather.json",
"kind": "file",
"bytes": 1074,
"sha256": "ac62cc2506922dd2f0f42c8d2fb9d2e5179d4e1b9634edde799e93d00c45486c"
},
{
"path": "receipts/23_yfinance_quote.json",
"kind": "file",
"bytes": 1246,
"sha256": "9184769717207d40fa7088546e4d8098894c7011eed6c3ab76c9703896e087f2"
},
{
"path": "receipts/24_currency_converter.json",
"kind": "file",
"bytes": 819,
"sha256": "ef2b8460f49d6d638069a5294298b8b739d456071c8c2ea0748f58e4171e5bca"
},
{
"path": "receipts/25_wikipedia_search.json",
"kind": "file",
"bytes": 1464,
"sha256": "bfabb0c16d414cd03270d8ddde3bd4614f360ff1e146e5d060db617aad4d1aad"
},
{
"path": "receipts/26_arxiv_search.json",
"kind": "file",
"bytes": 2654,
"sha256": "4aaf5cb13c715217ce64b0bc72f7d8f69166c34c218a0df73b4a8e85f19c93ca"
},
{
"path": "receipts/27_calendar_events.json",
"kind": "file",
"bytes": 728,
"sha256": "b4814069ff6c959c4e7d8b68a81eb0e6414ee9a622036a9ef52e26412a76e17d"
},
{
"path": "receipts/28_notion_search.json",
"kind": "file",
"bytes": 700,
"sha256": "bef9ac758b3bf75b86ea093da1e39e520bbf1cc9bb4581907d915ca99580e13d"
},
{
"path": "summary.json",
"kind": "file",
"bytes": 3690,
"sha256": "eb689c349441135e610b67c2a5c5754bb2713ff4f3442528e4cfe67ea96f806f"
}
]
}
@@ -0,0 +1,72 @@
{
"experiment": "4-1",
"title": "Perception tools MCP server five-category live campaign",
"authority": "book/chapter4.md:166",
"transport": "mcp-stdio",
"fail_closed": true,
"mutation_root_environment": "PERCEPTION_MUTATION_ROOT",
"categories": {
"search": {
"required_cases": [
"web_search",
"knowledge_base_search",
"download"
]
},
"multimodal": {
"required_cases": [
"webpage_reader",
"document_reader_pdf",
"document_reader_docx",
"document_reader_pptx",
"image_ocr",
"image_analyze",
"audio_transcribe",
"video_parser",
"video_analyze"
],
"credential_blocking_allowed": true
},
"filesystem": {
"required_cases": [
"file_reader",
"grep",
"directory_list",
"filesystem_copy",
"filesystem_move",
"filesystem_delete"
],
"required_safety_cases": [
"reject_parent_traversal",
"reject_absolute_path",
"reject_escaping_symlink"
]
},
"public_data": {
"required_cases": [
"weather",
"yfinance_quote",
"currency_converter",
"wikipedia_search",
"arxiv_search"
]
},
"private_data": {
"required_cases": [
"calendar_events",
"notion_search"
],
"credential_blocking_allowed": true
}
},
"acceptance": {
"catalog_from_real_mcp": true,
"catalog_contains_all_required_tools": true,
"every_success_is_substantive": true,
"filesystem_receipts_include_pre_post_hashes": true,
"filesystem_isolation_probes_are_rejected": true,
"private_sources_require_live_authorized_success": true,
"missing_or_invalid_credentials_never_pass": true,
"manifest_hashes_every_campaign_file": true
}
}
@@ -0,0 +1,58 @@
{
"case": "web_search",
"tool": "web_search",
"arguments": {
"query": "Model Context Protocol official specification",
"num_results": 3
},
"arguments_sha256": "f5d475b1c7202a0c7c2a0eba3e63e569ee6a65f46929b097a30983506ac9ebe7",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": true,
"substantive_observation": true,
"backend_provenance": {
"backend": "duckduckgo-live-search",
"origin": "live-api"
},
"simulation_markers": [],
"error_type": null,
"payload": {
"success": true,
"message": {
"query": "Model Context Protocol official specification",
"results": [
{
"id": "ddg-0",
"title": "Specification - Model Context Protocol",
"url": "https://modelcontextprotocol.io/specification/2025-03-26",
"snippet": "ModelContextProtocol(MCP) is an openprotocolthat enables seamless integration between LLM applications and external data sources and tools. Whether you're building an AI-powered IDE, enhancing a chat interface, or creating custom AI workflows, MCP provides a standardized way to connect LLMs with thecontextthey need.",
"source": "duckduckgo"
},
{
"id": "ddg-1",
"title": "Model Context Protocol (MCP)",
"url": "https://github.com/modelcontextprotocol/modelcontextprotocol",
"snippet": "ModelContextProtocol(MCP) Just heard of MCP and not sure where to start? Check out our documentation website. This repo contains the: MCPspecificationMCPprotocolschemaOfficialMCP documentation The schema is defined in TypeScript first, but made available as JSON Schema as well, for wider compatibility.",
"source": "duckduckgo"
},
{
"id": "ddg-2",
"title": "Specification - Model Context Protocol MCP",
"url": "https://modelcontextprotocol.info/specification/",
"snippet": "ModelContextProtocolSpecificationTheModelContextProtocol(MCP) is an openprotocolthat enables seamless integration between LLM applications and external data sources and tools. This section contains the detailed technicalspecificationsfor implementing theprotocol. Available Versions MCP is under active development. The followingspecificationsare available:Specification(Latest ...",
"source": "duckduckgo"
}
],
"count": 3
},
"metadata": {
"query": "Model Context Protocol official specification",
"search_engine": "duckduckgo",
"total_results": 3,
"search_time": 2.811976194381714,
"language": "en",
"country": "wt-wt"
}
},
"elapsed_seconds": 2.815
}
@@ -0,0 +1,39 @@
{
"case": "knowledge_base_search",
"tool": "knowledge_base_search",
"arguments": {
"query": "PERCEPTION-EXPERIMENT-4-1-VERIFIED",
"knowledge_base_path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/knowledge",
"top_k": 3
},
"arguments_sha256": "a037113782d17de95095588956c92a70293e74187fbe7479737e52e8d95c71ce",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": true,
"substantive_observation": true,
"backend_provenance": {
"backend": "local-knowledge-files",
"origin": "local-filesystem"
},
"simulation_markers": [],
"error_type": null,
"payload": {
"success": true,
"message": {
"query": "PERCEPTION-EXPERIMENT-4-1-VERIFIED",
"results": [
{
"file": "mcp-notes.md",
"snippet": "# Experiment 4-1\n\nPERCEPTION-EXPERIMENT-4-1-VERIFIED\nThe Model Context Protocol connects agents to perception tools.",
"relevance": 1
}
],
"total_found": 1
},
"metadata": {
"knowledge_base": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/knowledge",
"top_k": 3
}
},
"elapsed_seconds": 0.002
}
@@ -0,0 +1,31 @@
{
"case": "download",
"tool": "download",
"arguments": {
"url": "https://www.iana.org/help/example-domains",
"output_path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/downloads/iana-example.html",
"timeout": 60
},
"arguments_sha256": "fdfab80039415cec4d6f598262a554372ff80a6258b7c5e347ab96e4d851a9f1",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": true,
"substantive_observation": true,
"backend_provenance": {
"backend": "tls-http-download",
"origin": "live-api"
},
"simulation_markers": [],
"error_type": null,
"payload": {
"success": true,
"message": "Successfully downloaded file to /Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/downloads/iana-example.html",
"metadata": {
"url": "https://www.iana.org/help/example-domains",
"output_path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/downloads/iana-example.html",
"file_size_bytes": 6639,
"duration_seconds": 3.1630430221557617
}
},
"elapsed_seconds": 3.165
}
@@ -0,0 +1,39 @@
{
"case": "webpage_reader",
"tool": "webpage_reader",
"arguments": {
"url": "https://example.com",
"extract_text": true,
"extract_links": true
},
"arguments_sha256": "8e00a9ee1bbd11c9194efa2e61a4f1d6e01c603ab2a0feed14620c5663a70d8a",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": true,
"substantive_observation": true,
"backend_provenance": {
"backend": "tls-http-beautifulsoup",
"origin": "live-api"
},
"simulation_markers": [],
"error_type": null,
"payload": {
"success": true,
"message": {
"url": "https://example.com",
"title": "Example Domain",
"text": "Example DomainExample DomainThis domain is for use in documentation examples without needing permission. Avoid use in operations.Learn more",
"text_length": 139,
"links": [
{
"text": "Learn more",
"href": "https://iana.org/domains/example"
}
]
},
"metadata": {
"url": "https://example.com"
}
},
"elapsed_seconds": 1.576
}
@@ -0,0 +1,33 @@
{
"case": "document_reader_pdf",
"tool": "document_reader",
"arguments": {
"file_path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/documents/sample.pdf"
},
"arguments_sha256": "ffdbd5b47a22ff3ca67b25ffa2efb1bb4bcc8d76a5d9ef6257be8ac46f66da6f",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": true,
"substantive_observation": true,
"backend_provenance": {
"backend": "format-aware-local-parser",
"origin": "local-process"
},
"simulation_markers": [],
"error_type": null,
"payload": {
"success": true,
"message": {
"file_name": "sample.pdf",
"file_type": "pdf",
"page_count": 1,
"text": "Experiment 4-1 PDF PERCEPTION-EXPERIMENT-4-1-VERIFIED\n\n",
"text_length": 55
},
"metadata": {
"file_path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/documents/sample.pdf",
"file_type": ".pdf"
}
},
"elapsed_seconds": 0.003
}
@@ -0,0 +1,33 @@
{
"case": "document_reader_docx",
"tool": "document_reader",
"arguments": {
"file_path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/documents/sample.docx"
},
"arguments_sha256": "1fd4d08fd448e8c5b1a601f680c93ba45a972348bb2d63e2787314e9e47e4da9",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": true,
"substantive_observation": true,
"backend_provenance": {
"backend": "format-aware-local-parser",
"origin": "local-process"
},
"simulation_markers": [],
"error_type": null,
"payload": {
"success": true,
"message": {
"file_name": "sample.docx",
"file_type": "docx",
"paragraph_count": 2,
"text": "Experiment 4-1 DOCX\nPERCEPTION-EXPERIMENT-4-1-VERIFIED",
"text_length": 54
},
"metadata": {
"file_path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/documents/sample.docx",
"file_type": ".docx"
}
},
"elapsed_seconds": 0.01
}
@@ -0,0 +1,33 @@
{
"case": "document_reader_pptx",
"tool": "document_reader",
"arguments": {
"file_path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/documents/sample.pptx"
},
"arguments_sha256": "0782c7eea687c42ddb1fa7b163dae33ccf66f7a0a4434bc68a038e77be143c72",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": true,
"substantive_observation": true,
"backend_provenance": {
"backend": "format-aware-local-parser",
"origin": "local-process"
},
"simulation_markers": [],
"error_type": null,
"payload": {
"success": true,
"message": {
"file_name": "sample.pptx",
"file_type": "pptx",
"slide_count": 1,
"text": "Experiment 4-1 PPTX\nPERCEPTION-EXPERIMENT-4-1-VERIFIED\n",
"text_length": 55
},
"metadata": {
"file_path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/documents/sample.pptx",
"file_type": ".pptx"
}
},
"elapsed_seconds": 0.008
}
@@ -0,0 +1,38 @@
{
"case": "image_ocr",
"tool": "image_ocr",
"arguments": {
"image_path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/media/ocr-source.png",
"language": "eng"
},
"arguments_sha256": "a14725eb7b36a4db39a0e9ad841a32b96c50d0f6a12c2fa87ea1f8fe50b68669",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": true,
"substantive_observation": true,
"backend_provenance": {
"backend": "local-tesseract-ocr",
"origin": "local-process"
},
"simulation_markers": [],
"error_type": null,
"payload": {
"success": true,
"message": {
"file_name": "ocr-source.png",
"image_size": [
1200,
360
],
"extracted_text": "EXPERIMENT 4-1\nPERCEPTION TOOLS VERIFIED\n",
"text_length": 41,
"word_count": 5,
"language": "eng",
"method": "pytesseract"
},
"metadata": {
"file_path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/media/ocr-source.png"
}
},
"elapsed_seconds": 0.234
}
@@ -0,0 +1,27 @@
{
"case": "image_analyze",
"tool": "image_analyze",
"arguments": {
"image_path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/media/ocr-source.png",
"prompt": "Read the prominent text and describe the simple image."
},
"arguments_sha256": "5926223f0cda676b56ff3efee32f5a26d5f79c5017732b9490590c3e4cb6d2db",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": false,
"substantive_observation": false,
"backend_provenance": {
"backend": "configured-vision-api",
"origin": "live-api"
},
"simulation_markers": [],
"error_type": "ai_analysis_error",
"payload": {
"success": false,
"message": "AI image analysis failed: Error code: 429 - {'error': {'message': 'You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.', 'type': 'insufficient_quota', 'param': None, 'code': 'insufficient_quota'}}",
"metadata": {
"error_type": "ai_analysis_error"
}
},
"elapsed_seconds": 4.807
}
@@ -0,0 +1,35 @@
{
"case": "audio_transcribe",
"tool": "audio_transcribe",
"arguments": {
"file_path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/media/spoken-marker.aiff",
"model_size": "tiny",
"language": "en"
},
"arguments_sha256": "5fb61c195b9474cd3ebba4d40dc5b94ff1e2739c0a8d2b95696f598e85e40c03",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": true,
"substantive_observation": true,
"backend_provenance": {
"backend": "local-whisper-or-openai",
"origin": "local-process"
},
"simulation_markers": [],
"error_type": null,
"payload": {
"success": true,
"message": {
"file_name": "spoken-marker.aiff",
"file_type": ".aiff",
"model": "tiny",
"language": "en",
"transcription": " Experiment 4-1, Perception Tools Verified",
"word_count": 5
},
"metadata": {
"file_path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/media/spoken-marker.aiff"
}
},
"elapsed_seconds": 3.641
}
@@ -0,0 +1,35 @@
{
"case": "video_parser",
"tool": "video_parser",
"arguments": {
"video_path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/media/visual-marker.mp4",
"extract_frames": false
},
"arguments_sha256": "2e684aa70b7b2e7f607eaecd4ebe720c0024bca4f2a7d2532574e181c1bb11ed",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": true,
"substantive_observation": true,
"backend_provenance": {
"backend": "local-opencv",
"origin": "local-process"
},
"simulation_markers": [],
"error_type": null,
"payload": {
"success": true,
"message": {
"file_name": "visual-marker.mp4",
"duration_seconds": 1.6666666666666667,
"fps": 3.0,
"frame_count": 5,
"resolution": "1200x360",
"width": 1200,
"height": 360
},
"metadata": {
"file_path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/media/visual-marker.mp4"
}
},
"elapsed_seconds": 0.008
}
@@ -0,0 +1,28 @@
{
"case": "video_analyze",
"tool": "video_analyze",
"arguments": {
"video_path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/media/visual-marker.mp4",
"num_frames": 1,
"prompt": "Read the text shown in this frame."
},
"arguments_sha256": "4af8da761e5413e4fbafe1d24b61848b1ae0208d845fcf30dc6d161debae3d5e",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": false,
"substantive_observation": false,
"backend_provenance": {
"backend": "opencv-and-configured-vision-api",
"origin": "live-api"
},
"simulation_markers": [],
"error_type": "video_analysis_error",
"payload": {
"success": false,
"message": "Video analysis failed: Error code: 429 - {'error': {'message': 'You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.', 'type': 'insufficient_quota', 'param': None, 'code': 'insufficient_quota'}}",
"metadata": {
"error_type": "video_analysis_error"
}
},
"elapsed_seconds": 4.952
}
@@ -0,0 +1,33 @@
{
"case": "file_reader",
"tool": "file_reader",
"arguments": {
"file_path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/knowledge/mcp-notes.md",
"max_length": 2000
},
"arguments_sha256": "db6ff0ab24cd2a30d7b93839641e6b8e776c66021834393f0e0274bef2e42b0f",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": true,
"substantive_observation": true,
"backend_provenance": {
"backend": "local-filesystem",
"origin": "local-filesystem"
},
"simulation_markers": [],
"error_type": null,
"payload": {
"success": true,
"message": {
"file_path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/knowledge/mcp-notes.md",
"content": "# Experiment 4-1\n\nPERCEPTION-EXPERIMENT-4-1-VERIFIED\nThe Model Context Protocol connects agents to perception tools.\n",
"size_bytes": 117,
"truncated": false,
"encoding": "utf-8"
},
"metadata": {
"file_path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/knowledge/mcp-notes.md"
}
},
"elapsed_seconds": 0.003
}
@@ -0,0 +1,43 @@
{
"case": "grep",
"tool": "grep",
"arguments": {
"pattern": "PERCEPTION-EXPERIMENT-4-1-VERIFIED",
"directory": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/knowledge",
"file_pattern": "*.md",
"max_results": 10
},
"arguments_sha256": "6c84ec5e811ee8180a5dac8ced4cae2356559c1d6d9e54cf01fd9dd13f496f47",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": true,
"substantive_observation": true,
"backend_provenance": {
"backend": "local-regex-filesystem-search",
"origin": "local-filesystem"
},
"simulation_markers": [],
"error_type": null,
"payload": {
"success": true,
"message": {
"pattern": "PERCEPTION-EXPERIMENT-4-1-VERIFIED",
"results": [
{
"file": "mcp-notes.md",
"line_number": 3,
"line": "PERCEPTION-EXPERIMENT-4-1-VERIFIED",
"absolute_path": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/knowledge/mcp-notes.md"
}
],
"total_found": 1,
"truncated": false
},
"metadata": {
"directory": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/knowledge",
"file_pattern": "*.md",
"recursive": true
}
},
"elapsed_seconds": 0.003
}
@@ -0,0 +1,42 @@
{
"case": "directory_list",
"tool": "directory_list",
"arguments": {
"query": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/mutation_workspace",
"options_json": "{\"limit\": 20}"
},
"arguments_sha256": "6b2ff6d73716e55b10dbf06b950ed86d97f985f24afdfb123aedaf30f6f37bfe",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": true,
"substantive_observation": true,
"backend_provenance": {
"backend": "local-filesystem",
"origin": "local-filesystem"
},
"simulation_markers": [],
"error_type": null,
"payload": {
"success": true,
"tool": "directory_list",
"backend": "filesystem",
"data": [
{
"name": "escape-link",
"type": "file",
"size": 28
},
{
"name": "nested",
"type": "directory",
"size": 96
},
{
"name": "seed.txt",
"type": "file",
"size": 35
}
]
},
"elapsed_seconds": 0.004
}
@@ -0,0 +1,46 @@
{
"case": "filesystem_copy",
"tool": "filesystem_copy",
"arguments": {
"source_path": "seed.txt",
"destination_path": "copied.txt"
},
"arguments_sha256": "04e57c23d7913d6e4f1076b79fd13ebe887fd4387d676d6a058e4eb81f38633e",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": true,
"substantive_observation": true,
"backend_provenance": {
"backend": "workspace-confined-copy",
"origin": "local-filesystem"
},
"simulation_markers": [],
"error_type": null,
"payload": {
"success": true,
"message": {
"operation": "copy",
"source": "seed.txt",
"destination": "copied.txt",
"source_exists_after": true,
"destination_fingerprint": {
"kind": "file",
"sha256": "e088e8ab3d0dd13410c3b99f54f88aa805ad66d63294dd27f987722ede86f9fc",
"bytes": 35,
"entries": 1
},
"replaced_path_quarantine": null
},
"metadata": {
"mutation_root": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/mutation_workspace",
"pre_operation_fingerprint": {
"kind": "file",
"sha256": "e088e8ab3d0dd13410c3b99f54f88aa805ad66d63294dd27f987722ede86f9fc",
"bytes": 35,
"entries": 1
},
"verification": "source retained and destination fingerprint matches"
}
},
"elapsed_seconds": 0.003
}
@@ -0,0 +1,46 @@
{
"case": "filesystem_move",
"tool": "filesystem_move",
"arguments": {
"source_path": "copied.txt",
"destination_path": "moved.txt"
},
"arguments_sha256": "57260877dce1942e47de6c09e86bf0e2c74aac0f83d2eb41ef4f2abd7f16638e",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": true,
"substantive_observation": true,
"backend_provenance": {
"backend": "workspace-confined-rename",
"origin": "local-filesystem"
},
"simulation_markers": [],
"error_type": null,
"payload": {
"success": true,
"message": {
"operation": "move",
"source": "copied.txt",
"destination": "moved.txt",
"source_exists_after": false,
"destination_fingerprint": {
"kind": "file",
"sha256": "e088e8ab3d0dd13410c3b99f54f88aa805ad66d63294dd27f987722ede86f9fc",
"bytes": 35,
"entries": 1
},
"replaced_path_quarantine": null
},
"metadata": {
"mutation_root": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/mutation_workspace",
"pre_operation_fingerprint": {
"kind": "file",
"sha256": "e088e8ab3d0dd13410c3b99f54f88aa805ad66d63294dd27f987722ede86f9fc",
"bytes": 35,
"entries": 1
},
"verification": "source absent and destination fingerprint matches"
}
},
"elapsed_seconds": 0.003
}
@@ -0,0 +1,45 @@
{
"case": "filesystem_delete",
"tool": "filesystem_delete",
"arguments": {
"path": "moved.txt"
},
"arguments_sha256": "05ca93abb4caf2ca737949e5e7829d839c513edbfad1e44f00b95b3ce49fc1bd",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": true,
"substantive_observation": true,
"backend_provenance": {
"backend": "workspace-confined-quarantine",
"origin": "local-filesystem"
},
"simulation_markers": [],
"error_type": null,
"payload": {
"success": true,
"message": {
"operation": "delete",
"path": "moved.txt",
"path_exists_after": false,
"quarantine_path": ".perception-trash/20260729T214745523769Z-b72462a9b8e34102ae970d2336ccd557-moved.txt",
"reversible": true,
"quarantine_fingerprint": {
"kind": "file",
"sha256": "e088e8ab3d0dd13410c3b99f54f88aa805ad66d63294dd27f987722ede86f9fc",
"bytes": 35,
"entries": 1
}
},
"metadata": {
"mutation_root": "/Users/boj/book/ai-agent-book/chapter4/perception-tools/validation/experiment_4_1/real_mcp_20260729T214721Z/fixtures/mutation_workspace",
"pre_operation_fingerprint": {
"kind": "file",
"sha256": "e088e8ab3d0dd13410c3b99f54f88aa805ad66d63294dd27f987722ede86f9fc",
"bytes": 35,
"entries": 1
},
"verification": "original path absent and quarantine fingerprint matches"
}
},
"elapsed_seconds": 0.004
}
@@ -0,0 +1,29 @@
{
"case": "reject_parent_traversal",
"tool": "filesystem_copy",
"arguments": {
"source_path": "seed.txt",
"destination_path": "../escaped.txt"
},
"arguments_sha256": "f30b8515b7a09f4b2e769eb600c8dc378524249cc9d6bb311673a20d1b74d6f2",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": false,
"substantive_observation": false,
"backend_provenance": {
"backend": "workspace-confined-copy",
"origin": "local-filesystem"
},
"simulation_markers": [],
"error_type": "PermissionError",
"payload": {
"success": false,
"message": "Filesystem copy failed: Parent traversal is not allowed for filesystem mutations",
"metadata": {
"operation": "copy",
"error_type": "PermissionError",
"mutation_root_env": "PERCEPTION_MUTATION_ROOT"
}
},
"elapsed_seconds": 0.002
}
@@ -0,0 +1,28 @@
{
"case": "reject_absolute_path",
"tool": "filesystem_delete",
"arguments": {
"path": "/tmp"
},
"arguments_sha256": "ef28a75876b54cb665beeb4cb10d72f463c59d196f5ee4a08e62ac67e7247639",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": false,
"substantive_observation": false,
"backend_provenance": {
"backend": "workspace-confined-quarantine",
"origin": "local-filesystem"
},
"simulation_markers": [],
"error_type": "PermissionError",
"payload": {
"success": false,
"message": "Filesystem delete failed: Absolute paths are not allowed for filesystem mutations",
"metadata": {
"operation": "delete",
"error_type": "PermissionError",
"mutation_root_env": "PERCEPTION_MUTATION_ROOT"
}
},
"elapsed_seconds": 0.002
}
@@ -0,0 +1,28 @@
{
"case": "reject_escaping_symlink",
"tool": "filesystem_delete",
"arguments": {
"path": "escape-link"
},
"arguments_sha256": "0cda34db2d162698b7076bdf382db85514c3506df0f19278a094153ec55e3fe2",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": false,
"substantive_observation": false,
"backend_provenance": {
"backend": "workspace-confined-quarantine",
"origin": "local-filesystem"
},
"simulation_markers": [],
"error_type": "PermissionError",
"payload": {
"success": false,
"message": "Filesystem delete failed: Resolved path escapes the configured mutation root",
"metadata": {
"operation": "delete",
"error_type": "PermissionError",
"mutation_root_env": "PERCEPTION_MUTATION_ROOT"
}
},
"elapsed_seconds": 0.002
}
@@ -0,0 +1,44 @@
{
"case": "weather",
"tool": "weather",
"arguments": {
"location": "Singapore"
},
"arguments_sha256": "6b05a9aa723d910bd7a8a6b4579e099e8fcbb826fac7ee89cd347f9c274ce035",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": true,
"substantive_observation": true,
"backend_provenance": {
"backend": "open-meteo",
"origin": "live-api"
},
"simulation_markers": [],
"error_type": null,
"payload": {
"success": true,
"message": {
"location": "Singapore",
"country": "Singapore",
"latitude": 1.28967,
"longitude": 103.85007,
"temperature": 26.3,
"feels_like": 31.3,
"humidity": 87,
"precipitation": 0.0,
"weather_code": 3,
"description": "Overcast",
"wind_speed": 7.0,
"wind_direction": 167,
"units": "metric",
"timestamp": "2026-07-30T05:45",
"provider": "Open-Meteo"
},
"metadata": {
"location": "Singapore",
"provider": "Open-Meteo",
"api_key_required": false
}
},
"elapsed_seconds": 4.541
}
@@ -0,0 +1,48 @@
{
"case": "yfinance_quote",
"tool": "yfinance_quote",
"arguments": {
"symbol": "AAPL"
},
"arguments_sha256": "81c8d84ddf020b1584fa351351da6f46b756261e048fe93502b5f5c3fdc1e526",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": true,
"substantive_observation": true,
"backend_provenance": {
"backend": "yahoo-finance-yfinance",
"origin": "live-api"
},
"simulation_markers": [],
"error_type": null,
"payload": {
"success": true,
"message": {
"symbol": "AAPL",
"company_name": "Apple Inc.",
"current_price": 338.19,
"previous_close": 340.08,
"open": 339.69,
"day_high": 344.5699,
"day_low": 337.3501,
"volume": 48852885,
"average_volume": 55895206,
"market_cap": 4967117094912,
"fifty_two_week_high": 344.5699,
"fifty_two_week_low": 201.5,
"currency": "USD",
"exchange": "NMS",
"change": -1.89,
"change_percent": -0.56
},
"metadata": {
"symbol": "AAPL",
"operation": "get_stock_quote",
"execution_time": 4.013011932373047,
"data_points": 16,
"error_type": null,
"timestamp": "2026-07-30T05:47:54.088150"
}
},
"elapsed_seconds": 4.016
}
@@ -0,0 +1,35 @@
{
"case": "currency_converter",
"tool": "currency_converter",
"arguments": {
"amount": 10,
"from_currency": "USD",
"to_currency": "SGD"
},
"arguments_sha256": "8e2c229a505df791071d022f2070870bc3da118c47b105afe6d7ced02fbed2d2",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": true,
"substantive_observation": true,
"backend_provenance": {
"backend": "live-exchange-rate-api",
"origin": "live-api"
},
"simulation_markers": [],
"error_type": null,
"payload": {
"success": true,
"message": {
"amount": 10.0,
"from_currency": "USD",
"to_currency": "SGD",
"exchange_rate": 1.29,
"converted_amount": 12.9,
"timestamp": "2026-07-29"
},
"metadata": {
"rate": 1.29
}
},
"elapsed_seconds": 1.64
}
@@ -0,0 +1,39 @@
{
"case": "wikipedia_search",
"tool": "wikipedia_search",
"arguments": {
"query": "Model Context Protocol",
"language": "en",
"sentences": 3
},
"arguments_sha256": "697f2deabfb52773a614f77f31c5e61400afcc7b42b4ba0a282fc2d5b488d9df",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": true,
"substantive_observation": true,
"backend_provenance": {
"backend": "mediawiki",
"origin": "live-api"
},
"simulation_markers": [],
"error_type": null,
"payload": {
"success": true,
"message": {
"title": "Model Context Protocol",
"url": "https://en.wikipedia.org/wiki/Model_Context_Protocol",
"summary": "The Model Context Protocol (MCP) is an open standard and open-source framework introduced by Anthropic in November 2024 to standardize the way artificial intelligence (AI) systems like large language models (LLMs) integrate and share data with external tools, systems, and data sources. MCP provides a standardized interface for reading files, executing functions, and handling contextual prompts. Following its announcement, the protocol was adopted by major AI providers, including OpenAI and Google DeepMind.",
"language": "en",
"search_results": [
"Model Context Protocol",
"Agent harness",
"Anthropic"
]
},
"metadata": {
"query": "Model Context Protocol",
"language": "en"
}
},
"elapsed_seconds": 12.083
}
@@ -0,0 +1,64 @@
{
"case": "arxiv_search",
"tool": "arxiv_search",
"arguments": {
"query": "agentic artificial intelligence",
"max_results": 2,
"sort_by": "relevance"
},
"arguments_sha256": "7c091475ba1290dac931ea59515b34385cafe55fcafc0018f292c7d05d7152c1",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": true,
"substantive_observation": true,
"backend_provenance": {
"backend": "export.arxiv.org",
"origin": "live-api"
},
"simulation_markers": [],
"error_type": null,
"payload": {
"success": true,
"message": {
"query": "agentic artificial intelligence",
"papers": [
{
"title": "Creative Problem Solving in Artificially Intelligent Agents: A Survey and Framework",
"authors": [
"Evana Gizzi",
"Lakshmi Nair",
"Sonia Chernova",
"Jivko Sinapov"
],
"summary": "Creative Problem Solving (CPS) is a sub-area within Artificial Intelligence (AI) that focuses on methods for solving off-nominal, or anomalous problems in autonomous systems. Despite many advancements in planning and learning, resolving novel problems or adapting existing knowledge to a new context, especially in cases where the environment may change in unpredictable ways post deployment, remains a limiting factor in the safe and useful integration of intelligent systems. The emergence of incre...",
"published": "2022-04-21T18:31:44+00:00",
"url": "http://arxiv.org/abs/2204.10358v1",
"pdf_url": "https://arxiv.org/pdf/2204.10358v1",
"categories": [
"cs.AI"
]
},
{
"title": "The Artificial Scientist: Logicist, Emergentist, and Universalist Approaches to Artificial General Intelligence",
"authors": [
"Michael Timothy Bennett",
"Yoshihiro Maruyama"
],
"summary": "We attempt to define what is necessary to construct an Artificial Scientist, explore and evaluate several approaches to artificial general intelligence (AGI) which may facilitate this, conclude that a unified or hybrid approach is necessary and explore two theories that satisfy this requirement to some degree....",
"published": "2021-10-05T05:58:23+00:00",
"url": "http://arxiv.org/abs/2110.01831v1",
"pdf_url": "https://arxiv.org/pdf/2110.01831v1",
"categories": [
"cs.AI"
]
}
],
"count": 2
},
"metadata": {
"query": "agentic artificial intelligence",
"max_results": 2
}
},
"elapsed_seconds": 2.311
}
@@ -0,0 +1,27 @@
{
"case": "calendar_events",
"tool": "calendar_events",
"arguments": {
"calendar_id": "primary",
"max_results": 5
},
"arguments_sha256": "339afbf08769281fb4ed269e3d46da2d8e0d5eff86f0d4a6d36c0159414d7c7a",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": false,
"substantive_observation": false,
"backend_provenance": {
"backend": "google-calendar-api",
"origin": "private-live-api"
},
"simulation_markers": [],
"error_type": "missing_credentials",
"payload": {
"success": false,
"message": "Google Calendar not configured. Please run setup to authenticate.",
"metadata": {
"error_type": "missing_credentials"
}
},
"elapsed_seconds": 0.05
}
@@ -0,0 +1,27 @@
{
"case": "notion_search",
"tool": "notion_search",
"arguments": {
"query": "Experiment 4-1",
"page_size": 5
},
"arguments_sha256": "e5936e03cd7f40be1aa784beffd8a2c41a47d67dc53174b65aba9e6766784807",
"transport": "mcp-stdio",
"mcp_result_is_error": false,
"success": false,
"substantive_observation": false,
"backend_provenance": {
"backend": "notion-api",
"origin": "private-live-api"
},
"simulation_markers": [],
"error_type": "missing_credentials",
"payload": {
"success": false,
"message": "Notion API key not configured. Set NOTION_API_KEY.",
"metadata": {
"error_type": "missing_credentials"
}
},
"elapsed_seconds": 0.005
}
@@ -0,0 +1,145 @@
{
"experiment": "4-1",
"campaign_id": "real_mcp_20260729T214721Z",
"status": "blocked",
"acceptance": {
"status": "blocked",
"gates": {
"catalog_from_real_mcp": true,
"catalog_contains_all_required_tools": true,
"search_category_passed": true,
"multimodal_category_passed": false,
"filesystem_category_passed": true,
"public_data_category_passed": true,
"private_data_category_passed": false,
"filesystem_pre_post_hashes_verified": true,
"filesystem_isolation_probes_rejected": true,
"all_successes_substantive_and_non_simulated": true,
"exact_case_set_recorded": true
},
"categories": {
"search": {
"status": "passed",
"required_cases": [
"web_search",
"knowledge_base_search",
"download"
],
"missing_cases": [],
"invalid_cases": []
},
"multimodal": {
"status": "blocked",
"required_cases": [
"webpage_reader",
"document_reader_pdf",
"document_reader_docx",
"document_reader_pptx",
"image_ocr",
"image_analyze",
"audio_transcribe",
"video_parser",
"video_analyze"
],
"missing_cases": [],
"invalid_cases": [
"image_analyze",
"video_analyze"
]
},
"filesystem": {
"status": "passed",
"required_cases": [
"file_reader",
"grep",
"directory_list",
"filesystem_copy",
"filesystem_move",
"filesystem_delete"
],
"missing_cases": [],
"invalid_cases": []
},
"public_data": {
"status": "passed",
"required_cases": [
"weather",
"yfinance_quote",
"currency_converter",
"wikipedia_search",
"arxiv_search"
],
"missing_cases": [],
"invalid_cases": []
},
"private_data": {
"status": "blocked",
"required_cases": [
"calendar_events",
"notion_search"
],
"missing_cases": [],
"invalid_cases": [
"calendar_events",
"notion_search"
]
}
}
},
"receipt_count": 28,
"successful_cases": [
"web_search",
"knowledge_base_search",
"download",
"webpage_reader",
"document_reader_pdf",
"document_reader_docx",
"document_reader_pptx",
"image_ocr",
"audio_transcribe",
"video_parser",
"file_reader",
"grep",
"directory_list",
"filesystem_copy",
"filesystem_move",
"filesystem_delete",
"weather",
"yfinance_quote",
"currency_converter",
"wikipedia_search",
"arxiv_search"
],
"failed_or_blocked_cases": [
"image_analyze",
"video_analyze",
"reject_parent_traversal",
"reject_absolute_path",
"reject_escaping_symlink",
"calendar_events",
"notion_search"
],
"outside_witness_unchanged": true,
"credential_preflight": {
"secret_values_recorded": false,
"google_calendar": {
"token_file_exists": false,
"token_file_bytes": 0,
"oauth_credentials_sdk_importable": true,
"calendar_sdk_importable": true
},
"notion": {
"api_key_present": false,
"sdk_importable": true
},
"multimodal": {
"openai_key_present": true,
"openrouter_key_present": true,
"local_whisper_importable": true,
"pytesseract_importable": true,
"tesseract_executable_present": true,
"ffmpeg_executable_present": true
}
},
"generated_at": "2026-07-29T21:48:10.848716+00:00"
}