[{"data":1,"prerenderedAt":142},["ShallowReactive",2],{"$fBBQ5ulyG5jVWbIBJe3r8F-kTKQKf1scMJiu0B6qzX5k":3,"$f7AVZHmPutZ23_8XKkLbDtEszKCuiY3yPjIDp9eRXGag":5,"$fMAS9Mjj79CikJu8U6L7Oiek3zPyueMhfXm-KZsBy6cM":7,"$fKwZwWL7YZcqNfM-s69TJPq85t_Ex5kMxzFQLkg_rhx8":118},{"data":4},[],{"data":6},[],{"data":8,"meta":114},[9],{"id":10,"documentId":11,"title":12,"seo_title":13,"summary":14,"seo_description":15,"slug":16,"published_date":17,"body":18,"content":19,"createdAt":35,"updatedAt":36,"publishedAt":37,"blogauthor":38,"cover":60,"categories":103},328,"de9cgal6mqur4nbk50l3xppo","Как я заставил AI‑агента писать нормальный код на Spring","Spring AI-агент: Skills и MCP для нормального кода","Без контекста агент пишет «среднее приложение с GitHub». Показываю, как Skills и Spring MCP учат его следовать архитектуре и соглашениям проекта.","Как заставить AI-агента писать Spring-код под ваш проект: Spring Agent Toolkit от Amplicode и Spring АйО, Skills для JPA, DTO, CRUD и Spring MCP.","kak-ya-zastavil-ai-agenta-pisat-normalnyj-kod-na-spring","2026-05-30","Откуда берётся «среднее приложение с GitHub»? Если попросить агента создать JPA‑сущность или настроить Spring Security, то он выдаст вполне рабочий код. Вопрос только в одном: для какого проекта?\n\nМодели натренированы на миллионах репозиториев: студенческие работы, всех задолбавшая [Petclinic](https:\u002F\u002Fgithub.com\u002Fspring-projects\u002Fspring-petclinic), туториалы с YouTube, у меня кстати, есть [куча своих](https:\u002F\u002Fyoutube.com\u002Fplaylist?list=PL54TWTX_QkgYB7FWsHujTTawWvWSeQvmY&si=f7Onz1PLW7aeEGeB) :D.\n\nНо без чёткого контекста агент выдаёт «среднее приложение с GitHub»: всё синтаксически верно, но далеко не всегда вписывается в существующий РЕАЛЬНЫЙ проект. С Lombok или без него? Используя `@IdClass` или `@EmbeddedId`? Предпочитаешь Record'ы или классические классы? Как у тебя маппятся DTO? Агент этого не знает и чаще всего либо пытается угадать, либо начинает грепать всё что можно и нельзя.\n\nPrompt engineering помогает, но ненадолго. Прикреплять каждый раз примеры сущностей и архитектурные правила — это прошлый век. Интеграция в IDE с `@` и выбором файлов уже лучше, но всё равно надо постоянно об этом помнить и как РОБОТ писать ему одно и тоже.\n\n\u003Ch2 id=\"agentnyj-rezhim-ne-panaczeya\">Агентный режим не панацея\u003C\u002Fh2>\n\nОтдаёшь агенту задачу целиком и в простых случаях он большой молодец. Правильно добавил метод в репозиторий, наклепал CRUD-контроллер, ну просто красавчик.\n\n![]({{strapiUrl}}\u002Fuploads\u002F982d4dff315dbac557688ee6a31fad8d_9150de5b9f.webp)\n\nА потом ты просишь реализовать учёт рабочего расписания ветеринаров с валидацией пересечений приёмов… И вот тут агент уходит в свободное плавание по океану возможных решений.\n\nТехнически код может быть корректным, но он просто не вписывается в твою архитектуру и принятые договорённости у вас в команде. Агенту очень тяжело правильно заполнить контекст и понастоящему **узнать** твой проект. Проще всего ему заполнить пробел тем самым среднестатистическим GitHub-кодом. Так он и поступает.\n\n\u003Ch2 id=\"skills-vot-gde-nastoyashhij-graal\">Skills — вот где настоящий грааль!\u003C\u002Fh2>\n\n[Skills](https:\u002F\u002Fagentskills.io\u002Fhome) — это постоянные инструкции, которые агент подгружает автоматически при решении определённых задач. Без Skill он создаёт Spring Data JPA-репозиторий так, «как обычно делают в интернете». Со Skill сначала смотрит, как это сделано именно у тебя, и только потом добавляет свои знания. Круто? Круто!\n\nНо если собирать Skills с публичных агрегаторов ([SkillHub](https:\u002F\u002Fwww.skillhub.club) и т.п.), очень быстро начинаются конфликты. Один Skill любит один стиль, второй — другой. В итоге можно обзавестись довольно большим, но крайне бесполезным набором скиллов.\n\nSkills отлично передают соглашения и best practices. Но они статичные. А проект живой: бины меняются, доменная модель растёт, появляются новые эндпоинты для любимых JSON! Тут лучше всего дать агенту ещё и наборчик специализированных MCP, который в реальном времени сможет помочь агенту проанализировать твоё Spring-приложение не через `grep`, а через специальные тулы для сущноcтей, DTOшек и так далее. В итоге агент сможет за пару вызовов узнать:\n\n- дерево зависимостей сущности,\n- какие бины есть и как они связаны,\n- какие миграции уже существуют.\n\n\u003Cvideo src=\"https:\u002F\u002Fstorage.yandexcloud.net\u002Famplicode-site\u002Farticles\u002Fanatomiya_claude_code_pervichnyy_analiz_i_napolnenie_konteksta\u002Fspring_explore_with_mcp.mp4\" controls muted loop playsinline width=\"100%\" poster=\"{{strapiUrl}}\u002Fuploads\u002Fcover_kak_ya_zastavil_ai_agenta_pisat_normalnyj_kod_na_spring_578cbcc389.webp\" preload=\"none\">\u003C\u002Fvideo>\n\n\u003Ch2 id=\"spring-agent-toolkit-skills-mcp-kotorye-rabotayut-vmeste\">Spring Agent Toolkit: Skills + MCP, которые работают вместе\u003C\u002Fh2>\n\nКоманда [Amplicode](https:\u002F\u002Famplicode.ru\u002F) вместе с экспертами [Spring АйО](https:\u002F\u002Ft.me\u002Fspring_aio) собрали [**Spring Agent Toolkit**](https:\u002F\u002Famplicode.ru\u002Fai-spring-agent\u002F) — набор Skills и MCP-сервер, которые изначально заточены друг под друга. В отличие от случайного набора скиллов, здесь всё протестировано на совместимость. Конфликтов между скиллами не возникает. Набор постоянно пополняется. Skills подключаются именно тогда, когда нужны.\n\n**Spring MCP** (работает через плагин Amplicode для IntelliJ IDEA и OpenIDE) даёт агенту следующие инструменты:\n\n- `list_spring_beans_tool`\n- `get_entity_details`\n- `create_migration_script`\n- и возможность запускать\u002Fотлаживать приложение\n\nА среди Skills есть:\n\n- **Spring Planning** — грамотная декомпозиция задач с учётом архитектуры. [Skill на GitHub](https:\u002F\u002Fgithub.com\u002FAmplicode\u002Fspring-skills\u002Ftree\u002Fmain\u002Fskills\u002Fspring-planning)\n- **Spring Explore** — глубокий анализ проекта. [Skill на GitHub](https:\u002F\u002Fgithub.com\u002FAmplicode\u002Fspring-skills\u002Ftree\u002Fmain\u002Fskills\u002Fspring-explore)\n- **Spring Data JPA**– лучшие практики для кодогенерации JPA-кода. [Skill на GitHub](https:\u002F\u002Fgithub.com\u002FAmplicode\u002Fspring-skills\u002Ftree\u002Fmain\u002Fskills\u002Fspring-data-jpa)\n- **DTO Creator** – ДТОшки будут точно такими же, какие вы уже используете на проекте. [Skill на GitHub](https:\u002F\u002Fgithub.com\u002FAmplicode\u002Fspring-skills\u002Ftree\u002Fmain\u002Fskills\u002Fdto-creator)\n- **CRUD REST Controller**– думаю ты догадался. [Skill на GitHub](https:\u002F\u002Fgithub.com\u002FAmplicode\u002Fspring-skills\u002Ftree\u002Fmain\u002Fskills\u002Fcrud-rest-controller)\n- **Java Debug** – пока в разработке, но кажется это, что многие хотели бы. [Skill на GitHub](https:\u002F\u002Fgithub.com\u002FAmplicode\u002Fspring-skills\u002Ftree\u002Fmain\u002Fskills\u002Fjava-debug)\n- [и другие](https:\u002F\u002Fgithub.com\u002FAmplicode\u002Fspring-skills\u002Ftree\u002Fmain\u002Fskills)\n\n![]({{strapiUrl}}\u002Fuploads\u002F3212fcd12760fd7a5dae28c86e50d378_3d9d576195.webp)\n\n\u003Ch2 id=\"kak-nachat\">Как начать?\u003C\u002Fh2>\n\nУстановить Spring Skills глобально во все обнаруженные агенты:\n\n```bash\nnpx skills add Amplicode\u002Fspring-skills -g\n```\n\nУстановить только для конкретных агентов (пример — Claude Code + Codex + Gemini CLI):\n\n```bash\nnpx skills add Amplicode\u002Fspring-skills -g -a claude-code -a codex -a gemini-cli\n```\n\nС более подробной инструкцией можно ознакомиться [тут](https:\u002F\u002Famplicode.ru\u002Fdocumentation\u002Fspring-agent\u002F).\n\nНабор Skills продолжает пополняться. Актуальный список — в [репозитории](https:\u002F\u002Fgithub.com\u002FAmplicode\u002Fspring-skills). Обратная связь и обсуждения — в телеграм-каналах [Spring АйО](https:\u002F\u002Ft.me\u002Fspring_aio_chat) и [Amplicode](https:\u002F\u002Ft.me\u002Famplicode_chat).\n\n---\n\n_Впервые опубликовано на [Хабре](https:\u002F\u002Fhabr.com\u002Fru\u002Fcompanies\u002Fhaulmont\u002Farticles\u002F1040280\u002F)._\n",[20],{"title":21,"links":22},"Содержание",[23,26,29,32],{"label":24,"href":25},"Агентный режим не панацея","#agentnyj-rezhim-ne-panaczeya",{"label":27,"href":28},"Skills — вот где настоящий грааль!","#skills-vot-gde-nastoyashhij-graal",{"label":30,"href":31},"Spring Agent Toolkit: Skills + MCP, которые работают вместе","#spring-agent-toolkit-skills-mcp-kotorye-rabotayut-vmeste",{"label":33,"href":34},"Как начать?","#kak-nachat","2026-11-12T11:24:07.477Z","2026-11-13T11:49:15.440Z","2026-11-13T11:49:15.497Z",{"id":39,"documentId":40,"firstname":41,"lastname":42,"createdAt":43,"updatedAt":44,"publishedAt":45,"slug":46,"photo":47},40,"yuewij1jc3qoxmkvsh2mpeny","Георгий","Власов","2026-02-17T11:40:25.168Z","2026-11-13T11:49:25.324Z","2026-11-13T11:49:25.371Z","georgij-vlasov",{"id":48,"documentId":49,"name":50,"alternativeText":51,"caption":51,"width":52,"height":52,"formats":51,"hash":53,"ext":54,"mime":55,"size":56,"url":57,"previewUrl":51,"provider":58,"provider_metadata":51,"createdAt":59,"updatedAt":59,"publishedAt":59,"focalPoint":51},1359,"jt1gpp4kqcyzwuwfhzj1c1vc","Gosha_ab88bd0ec5.webp",null,96,"Gosha_ab88bd0ec5_972867885d",".webp","image\u002Fwebp",2.14,"\u002Fuploads\u002FGosha_ab88bd0ec5_972867885d.webp","local","2026-11-13T11:47:15.450Z",{"id":61,"documentId":62,"name":63,"alternativeText":51,"caption":51,"width":64,"height":65,"formats":66,"hash":99,"ext":54,"mime":55,"size":100,"url":101,"previewUrl":51,"provider":58,"provider_metadata":51,"createdAt":102,"updatedAt":102,"publishedAt":102,"focalPoint":51},1218,"qu9xsw0figjcdbujudpcfspj","cover-kak-ya-zastavil-ai-agenta-pisat-normalnyj-kod-na-spring.webp",1280,833,{"thumbnail":67,"small":75,"medium":83,"large":91},{"name":68,"hash":69,"ext":54,"mime":55,"path":51,"width":70,"height":71,"size":72,"sizeInBytes":73,"url":74},"thumbnail_cover-kak-ya-zastavil-ai-agenta-pisat-normalnyj-kod-na-spring.webp","thumbnail_cover_kak_ya_zastavil_ai_agenta_pisat_normalnyj_kod_na_spring_578cbcc389",240,156,13.8,13802,"\u002Fuploads\u002Fthumbnail_cover_kak_ya_zastavil_ai_agenta_pisat_normalnyj_kod_na_spring_578cbcc389.webp",{"name":76,"hash":77,"ext":54,"mime":55,"path":51,"width":78,"height":79,"size":80,"sizeInBytes":81,"url":82},"small_cover-kak-ya-zastavil-ai-agenta-pisat-normalnyj-kod-na-spring.webp","small_cover_kak_ya_zastavil_ai_agenta_pisat_normalnyj_kod_na_spring_578cbcc389",500,325,51.12,51120,"\u002Fuploads\u002Fsmall_cover_kak_ya_zastavil_ai_agenta_pisat_normalnyj_kod_na_spring_578cbcc389.webp",{"name":84,"hash":85,"ext":54,"mime":55,"path":51,"width":86,"height":87,"size":88,"sizeInBytes":89,"url":90},"medium_cover-kak-ya-zastavil-ai-agenta-pisat-normalnyj-kod-na-spring.webp","medium_cover_kak_ya_zastavil_ai_agenta_pisat_normalnyj_kod_na_spring_578cbcc389",750,488,97.79,97786,"\u002Fuploads\u002Fmedium_cover_kak_ya_zastavil_ai_agenta_pisat_normalnyj_kod_na_spring_578cbcc389.webp",{"name":92,"hash":93,"ext":54,"mime":55,"path":51,"width":94,"height":95,"size":96,"sizeInBytes":97,"url":98},"large_cover-kak-ya-zastavil-ai-agenta-pisat-normalnyj-kod-na-spring.webp","large_cover_kak_ya_zastavil_ai_agenta_pisat_normalnyj_kod_na_spring_578cbcc389",1000,651,147.14,147136,"\u002Fuploads\u002Flarge_cover_kak_ya_zastavil_ai_agenta_pisat_normalnyj_kod_na_spring_578cbcc389.webp","cover_kak_ya_zastavil_ai_agenta_pisat_normalnyj_kod_na_spring_578cbcc389",227.69,"\u002Fuploads\u002Fcover_kak_ya_zastavil_ai_agenta_pisat_normalnyj_kod_na_spring_578cbcc389.webp","2026-11-13T11:43:59.476Z",[104],{"id":105,"documentId":106,"title":107,"published":108,"weight":109,"slug":110,"createdAt":111,"updatedAt":112,"publishedAt":113,"color":51},4,"ap54riuwcv7sj63auhmb4i6d","Гайды",true,3,"guides","2026-11-12T11:20:31.298Z","2026-11-12T11:22:44.141Z","2026-11-12T11:22:44.122Z",{"pagination":115},{"page":116,"pageSize":117,"pageCount":116,"total":116},1,25,{"data":119,"meta":138},[120,126,132],{"published_date":121,"id":122,"documentId":123,"title":124,"slug":125},"2026-09-28",327,"lruxexelyn19uak89r6dney5","Что такое OpenSpec? Полный гайд по Spec-Driven Development","chto-takoe-openspec-polnyj-gajd-po-spec-driven-development",{"published_date":127,"id":128,"documentId":129,"title":130,"slug":131},"2026-09-10",326,"ymtfa6pslevvkrwnohdfbi1u","Как не потерять интеграцию с Docker в IDE после блокировки JetBrains","kak-ne-poteryat-integracziyu-s-docker-v-ide-posle-blokirovki-jetbrains",{"published_date":133,"id":134,"documentId":135,"title":136,"slug":137},"2026-09-01",400,"dskd9jsck2vjm1d0ztoz91uo","JavaScript и TypeScript в OpenIDE: Node.js, React, Angular, Git и работа с API","javascript-i-typescript-v-openide",{"pagination":139},{"page":116,"pageSize":109,"pageCount":140,"total":141},6,16,1794584599929]