Последняя проверка: май 2026 г.
Отработайте темы экзамена CCA-F прямо в терминале — команды Claude Code CLI, вызовы Anthropic API, серверы MCP и мультиагентные паттерны, каждый привязан к домену экзамена.
К концу этой лабораторной работы вы установите Claude Code, настроите проект с помощью CLAUDE.md, создадите пользовательскую слэш-команду, подключите сервер MCP, опробуете API tool_use со структурированным выводом, изучите расширенное мышление и построите конвейер многоагентного супервизора — охватив все пять доменов экзамена CCA-F из вашего терминала. Учетная запись в облаке или оплата не требуются; все работает локально.
node --version)ANTHROPIC_API_KEY в вашей оболочке (export ANTHROPIC_API_KEY=sk-ant-...)mkdir cca-f-lab && cd cca-f-lab)Вызовы API Anthropic влекут за собой плату, основанную на использовании. Шаги 6–8 и 10 используют claude-sonnet-4-6, который стоит примерно $3/М входных токенов и $15/М выходных токенов. Общая стоимость этой лабораторной работы обычно составляет менее $0.15. Расширенное мышление (Шаг 7) использует дополнительные токены мышления, тарифицируемые по ставке вывода.
Claude Code — это CLI, который экзамен CCA-F проверяет наиболее непосредственно — конфигурация, хуки, слэш-команды и режимы разрешений все находятся здесь. Мы начинаем с его глобальной установки, чтобы каждый последующий шаг мог вызывать claude.
После установки быстрая команда claude --version подтверждает наличие исполняемого файла в вашем PATH, а claude --print-system-prompt подтверждает действительность ключа API (она делает легкий вызов «под капотом»).
# Install Claude Code globally
npm install -g @anthropic-ai/claude-code
# Verify installation
claude --version
# Confirm API connectivity (prints the built-in system prompt)
claude --print-system-prompt | head -20Экзамен тщательно проверяет трехуровневую иерархию CLAUDE.md: пользовательский (~/.claude/CLAUDE.md), проектный (корень репозитория) и модульный (подкаталоги). Каждый уровень наследует от предыдущего и может его переопределять.
Мы создадим файл на уровне проекта, который устанавливает соглашения о кодировании, и файл на уровне пользователя, который устанавливает личные предпочтения. Когда Claude Code читает проект, он объединяет все три уровня — именно то поведение, о котором спрашивает экзамен.
# Create project root CLAUDE.md
cat > CLAUDE.md << 'EOF'
# Project: CCA-F Lab
## Coding conventions
- Use TypeScript for all new files
- Prefer const over let
- Use single quotes for strings
- No semicolons (Prettier default)
## Testing
- Run `npm test` before committing
- All new functions must have at least one test
EOF
# Create user-level CLAUDE.md (applies to ALL your projects)
mkdir -p ~/.claude
cat > ~/.claude/CLAUDE.md << 'EOF'
# User preferences
- Be concise in responses
- Prefer functional programming patterns
- Always explain the "why" before showing code
EOF
# Verify Claude Code sees both files
claude "What instructions do you see in CLAUDE.md?" --printПользовательские слэш-команды находятся в .claude/commands/ как файлы Markdown. Имя файла становится именем команды (например, scaffold.md → /scaffold). Содержимое файла — это шаблон промпта — он может включать $ARGUMENTS для пользовательского ввода.
Это часто встречающаяся тема на экзамене: где живут команды, как передаются аргументы и чем они отличаются от хуков.
# Create the commands directory
mkdir -p .claude/commands
# Create a scaffold command
cat > .claude/commands/scaffold.md << 'EOF'
Create a new TypeScript module named $ARGUMENTS with:
1. A main source file at src/$ARGUMENTS/index.ts
2. A test file at src/$ARGUMENTS/__tests__/index.test.ts
3. Export the module from the project root index.ts
Follow the coding conventions in CLAUDE.md.
EOF
# Test the command (Claude Code will execute it interactively)
claude /scaffold calculatorХуки запускают команды оболочки в ответ на события Claude Code. Экзамен проверяет три типа хуков: PreToolUse (до запуска инструмента), PostToolUse (после) и Notification (при изменении статуса). Хуки определяются в .claude/settings.json.
Мы добавим хук PostToolUse, который запускает линтер после каждого редактирования файла — это распространенный производственный шаблон, о котором часто спрашивают на экзамене.
# Initialize a package.json so we have a lint script
npm init -y
npm install --save-dev typescript @typescript-eslint/parser
# Create project-level settings with a post-tool hook
mkdir -p .claude
cat > .claude/settings.json << 'EOF'
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"command": "npx tsc --noEmit 2>&1 | head -5"
}
]
},
"permissions": {
"allow": [
"Read",
"Write",
"Edit"
]
}
}
EOF
# Verify settings are recognized
cat .claude/settings.jsonПротокол Model Context Protocol (MCP) является ключевым доменом экзамена. Серверы MCP предоставляют инструменты, ресурсы и промпты клиентам LLM через стандартизированный протокол JSON-RPC. Транспорт stdio является самым простым — сервер читает из stdin и пишет в stdout.
Мы создадим минимальный MCP-сервер, который предоставляет инструмент get_weather, затем настроим Claude Code для подключения к нему. Это отрабатывает полный жизненный цикл MCP, проверяемый экзаменом: определение инструмента, настройка транспорта, вызов инструмента и обработка результатов.
# Install the MCP SDK
npm install @modelcontextprotocol/sdk
# Create the MCP server
cat > mcp-weather.mjs << 'EOF'
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
const server = new McpServer({ name: "weather", version: "1.0.0" });
server.tool("get_weather", { city: { type: "string" } }, async ({ city }) => ({
content: [{ type: "text", text: `Weather in ${city}: 72°F, sunny` }],
}));
const transport = new StdioServerTransport();
await server.connect(transport);
EOF
# Register the MCP server in Claude Code settings
cat > .claude/settings.json << 'EOF'
{
"mcpServers": {
"weather": {
"command": "node",
"args": ["mcp-weather.mjs"]
}
}
}
EOF
# Ask Claude Code to use the MCP tool
claude "What is the weather in Tokyo? Use the get_weather tool."Экзамен подробно проверяет поток использования инструментов API Messages: вы отправляете tools в запросе, модель отвечает блоком содержимого tool_use, вы его выполняете и возвращаете tool_result, затем модель формирует окончательный ответ.
Этот шаг использует curl для прямого вызова API — это наиболее соответствующий экзамену подход, так как экзамен проверяет формат необработанного запроса/ответа, а не обертки SDK.
# Call the Messages API with a tool definition
curl -s https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"tools": [{
"name": "calculate",
"description": "Evaluate a math expression",
"input_schema": {
"type": "object",
"properties": {
"expression": { "type": "string", "description": "Math expression to evaluate" }
},
"required": ["expression"]
}
}],
"messages": [{
"role": "user",
"content": "What is 15% tip on a $85.50 dinner bill?"
}]
}' | python3 -m json.toolРасширенное мышление позволяет модели использовать блок thinking для пошагового рассуждения перед ответом. Экзамен проверяет, когда его использовать (сложные рассуждения, математика, генерация кода) и как настроить budget_tokens.
Мы отправляем намеренно сложную логическую головоломку и сравниваем ответы с расширенным мышлением и без него, чтобы лично увидеть разницу в качестве.
# Request WITH extended thinking
curl -s https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-4-6",
"max_tokens": 16000,
"thinking": {
"type": "enabled",
"budget_tokens": 10000
},
"messages": [{
"role": "user",
"content": "A farmer has 17 sheep. All but 9 run away. How many does he have left? Explain your reasoning step by step."
}]
}' | python3 -m json.tool
# The response includes a "thinking" block showing the model's
# internal reasoning before the final answer.Кэширование промптов позволяет помечать части запроса как кэшируемые. Кэшированные префиксы стоят на 90% меньше при последующих вызовах и не имеют дополнительной задержки. Экзамен проверяет размещение блока cache_control и заголовки попадания в кэш.
Мы отправляем один и тот же большой системный промпт дважды и проверяем заголовки ответа, чтобы подтвердить попадание в кэш при втором вызове.
# First call — creates the cache entry
curl -s -D /dev/stderr https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-4-6",
"max_tokens": 256,
"system": [{
"type": "text",
"text": "You are a helpful assistant specialized in cloud architecture. You follow AWS Well-Architected Framework principles. You always recommend infrastructure as code. You prefer Terraform over CloudFormation. You prioritize security and cost optimization.",
"cache_control": { "type": "ephemeral" }
}],
"messages": [{ "role": "user", "content": "How should I set up VPC peering?" }]
}' > /dev/null 2>&1
# Second call — should hit the cache (check usage.cache_read_input_tokens)
curl -s https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-4-6",
"max_tokens": 256,
"system": [{
"type": "text",
"text": "You are a helpful assistant specialized in cloud architecture. You follow AWS Well-Architected Framework principles. You always recommend infrastructure as code. You prefer Terraform over CloudFormation. You prioritize security and cost optimization.",
"cache_control": { "type": "ephemeral" }
}],
"messages": [{ "role": "user", "content": "What about NAT gateway sizing?" }]
}' | python3 -c "import sys,json; d=json.load(sys.stdin); print(f\"Cache read tokens: {d['usage'].get('cache_read_input_tokens', 0)}\")"Экзамен проверяет, как запускать Claude Code неинтерактивно — флаг --print выводит результат в stdout без интерактивной сессии, а --output-format json предоставляет структурированный вывод для написания скриптов.
Это шаблон, используемый в конвейерах CI/CD: подать промпт, получить результат, программно его разобрать.
# Headless mode: prompt in, text out
claude --print "List 3 TypeScript best practices, one per line"
# JSON output for programmatic use
claude --print --output-format json "What is 2+2?"
# Pipe a file for code review (CI pattern)
echo 'const x: any = "hello";' > example.ts
claude --print "Review this TypeScript file for type safety issues: $(cat example.ts)"Домен 1 (Agentic Architecture, 27%) имеет наибольший вес на экзамене. Паттерн супервизора — один оркестратор, распределяющий задачи между специализированными субагентами, каждый со своим системным промптом и набором инструментов — является наиболее проверяемой архитектурой.
Мы создадим автономный скрипт Node.js, который реализует супервизора, координирующего двух специалистов: исследователя, который читает файлы и резюмирует, и писателя, который создает вывод. Супервизор декомпозирует задачу, делегирует ее каждому специалисту через отдельные вызовы API и агрегирует результаты. Запустите его из терминала и наблюдайте за делегированием в реальном времени.
# Install the Anthropic SDK
npm install @anthropic-ai/sdk
# Create sample data for the agents to work with
cat > sales-data.csv << 'EOF'
month,revenue,units
Jan,12500,150
Feb,15200,180
Mar,11800,140
Apr,18900,220
May,22100,260
Jun,19500,230
EOF
# Create the multi-agent supervisor script
cat > supervisor.mjs << 'SCRIPT'
import Anthropic from "@anthropic-ai/sdk";
import { readFileSync } from "fs";
const client = new Anthropic();
async function callAgent(role, systemPrompt, userMessage) {
console.log(`\n--- ${role} agent ---`);
const response = await client.messages.create({
model: "claude-sonnet-4-6",
max_tokens: 1024,
system: systemPrompt,
messages: [{ role: "user", content: userMessage }],
});
const text = response.content
.filter((b) => b.type === "text")
.map((b) => b.text)
.join("\n");
console.log(text);
return text;
}
// --- Supervisor: decompose, delegate, aggregate ---
const data = readFileSync("sales-data.csv", "utf-8");
console.log("=== SUPERVISOR: Decomposing task ===");
console.log("Task: Analyze sales data and write a brief executive summary.\n");
console.log("Step 1: Delegate analysis to Researcher agent");
console.log("Step 2: Delegate writing to Writer agent");
console.log("Step 3: Combine results\n");
// Sub-agent 1: Researcher — extracts insights
const analysis = await callAgent(
"Researcher",
"You are a data analyst. Extract key trends, highs, lows, and growth rates. Be precise with numbers. Output bullet points only.",
`Analyze this CSV data:\n\n${data}`
);
// Sub-agent 2: Writer — produces the summary from the analysis
const summary = await callAgent(
"Writer",
"You are a business writer. Write a 3-sentence executive summary from the analysis provided. Use a professional tone. Include specific numbers.",
`Write an executive summary based on these findings:\n\n${analysis}`
);
console.log("\n=== SUPERVISOR: Final aggregated output ===");
console.log(summary);
SCRIPT
# Run the supervisor
node supervisor.mjsЭта лабораторная работа полностью выполняется локально — нет облачных ресурсов для удаления.
# Remove the lab directory
cd .. && rm -rf cca-f-lab
# Optionally remove the user-level CLAUDE.md we created
rm -f ~/.claude/CLAUDE.md
# Optionally uninstall Claude Code
npm uninstall -g @anthropic-ai/claude-code
Эта лабораторная работа сосредоточена на практических упражнениях с CLI и API. Она не охватывает:
Batch API) — асинхронная пакетная конечная точка концептуально проста, но выполнение занимает минуты; Playbook охватывает формат запроса.