> Senior AI Engineer in Styria, Austria: MCP servers, LLM integration and agent pipelines that turn a ticket into a tested pull request. Remote or near Graz.
>
> Web page: https://balazscsorba.com/expertise/ai-engineer · Language: English · Also available in: [Deutsch](https://balazscsorba.com/de/expertise/ai-engineer.md) · [Magyar](https://balazscsorba.com/hu/expertise/ai-engineer.md)

Expertise

# AI engineer for MCP servers, LLM integration and coding agents

I build the tooling that lets AI agents work inside real codebases, ticket systems and CI – and tests, static analysis and human review still decide what ships.

Open for new projects

[Get in touch](https://balazscsorba.com/#contact) [See all references](https://balazscsorba.com/references)

## What I bring

-   ### Ticket-to-PR agent pipelines

    Agent skills that reproduce a production bug from synced data, prove the root cause, create the Jira ticket, fix it with unit and Playwright tests and open the pull request.

-   ### LLM integration

    LLM features wired into existing products: embeddings and vector search, tool calling and structured outputs – with evals and guardrails instead of black boxes.

-   ### Agent-ready websites

    This site talks to AI agents: WebMCP tools in the browser, llms.txt and every page as Markdown – generated from the same build as the HTML.

## Projects that prove it

Real projects, real numbers – the full list is on the references page.

-   Messerle Shop

    ### Ticket-to-PR agent pipeline

    Agent skills that take a bug from report to pull request: reproduce it from synced data, prove the root cause, create the Jira ticket, fix it with unit + Playwright E2E tests and pass the PHPUnit/PHPStan gate.

    -   Claude Code
    -   OpenCode
    -   Agent skills
    -   Playwright
    -   PHPUnit
    -   GitHub API

    [Read the article](https://balazscsorba.com/blog/coding-agent-skills-workflow)

-   balazscsorba.com

    ### Agent-ready portfolio

    This site talks to AI agents: WebMCP tools in the browser, llms.txt and llms-full.txt, and every page as Markdown via content negotiation – all generated from the same build.

    -   Nuxt
    -   WebMCP
    -   llms.txt
    -   Markdown for agents

    Own project[balazscsorba.com](https://balazscsorba.com/)

## Toolbox

-   Agentic engineering
-   MCP servers (Model Context Protocol)
-   Embeddings & vector search
-   Tool calling & structured outputs
-   Multi-agent orchestration
-   Claude Code & agent skills
-   OpenCode · Codex
-   LLM API integration (Anthropic, OpenAI)
-   Prompt & context engineering
-   LLM evals & guardrails
-   Agent guardrails: tests & CI gates
-   WebMCP · llms.txt
-   AI-assisted code review

## Articles on this topic

-   [Claude in OpenCode: the Claude Agent provider, API keys and the other routes](https://balazscsorba.com/blog/claude-in-opencode)
-   [Claude Code Review is generally available: how the multi-agent review works and costs](https://balazscsorba.com/blog/claude-code-review)
-   [Claude pricing explained: Free, Pro, Max, Team and the API, and how usage limits work](https://balazscsorba.com/blog/claude-plans-pricing-usage-limits)
-   [Claude skills: how to write a SKILL.md that loads at the right moment](https://balazscsorba.com/blog/claude-skills-guide)
-   [Claude Haiku 5.5: pricing, effort levels and the jobs it takes over from Sonnet](https://balazscsorba.com/blog/claude-haiku-5-5)
-   [DeepSeek V4.1 Flash 1017: 890 bytes of KV cache per token, and what that buys an agent](https://balazscsorba.com/blog/deepseek-v4-1-flash-1017)

### More on this topic

-   [LLM rate limits in production: retries, backoff and provider fallback](https://balazscsorba.com/blog/llm-rate-limits-retries-provider-fallback)
-   [Prompt versioning in production: git, registries, labels and rollbacks](https://balazscsorba.com/blog/prompt-versioning-management)
-   [LLM batch APIs: half-price inference for work that can wait](https://balazscsorba.com/blog/llm-batch-api-offline-workloads)
-   [Designing tools for AI agents: names, descriptions, schemas and error messages](https://balazscsorba.com/blog/agent-tool-design-descriptions-errors)
-   [Choosing an embedding model in 2026: leaderboards, costs and a bake-off on your own data](https://balazscsorba.com/blog/embedding-model-selection-2026)
-   [Contextual retrieval and late chunking: giving RAG chunks back their context](https://balazscsorba.com/blog/contextual-retrieval-late-chunking)
-   [Access control for RAG: permission-aware retrieval without leaking documents](https://balazscsorba.com/blog/rag-access-control-permissions)
-   [LLM output guardrails: moderation, safe rendering and validation before anything acts](https://balazscsorba.com/blog/llm-output-guardrails-moderation)
-   [Small language models: when a 4B model is enough](https://balazscsorba.com/blog/small-language-models-when-enough)
-   [Reasoning effort and thinking budgets: how much should a model think?](https://balazscsorba.com/blog/reasoning-models-effort-thinking-budget)
-   [Migrating a legacy codebase with coding agents: a strangler fig playbook](https://balazscsorba.com/blog/coding-agents-legacy-codebase-migration)
-   [Background coding agents that open PRs: a practical async workflow](https://balazscsorba.com/blog/background-agents-async-pr-workflow)
-   [Query rewriting for conversational search: context, HyDE and filters](https://balazscsorba.com/blog/conversational-search-query-rewriting)
-   [Generating synthetic test data for RAG evaluations](https://balazscsorba.com/blog/synthetic-test-data-rag-evals)
-   [AI red teaming checklist for LLM apps: what to attack before your users do](https://balazscsorba.com/blog/ai-red-teaming-checklist-llm-apps)
-   [Structured outputs with JSON Schema: what the guarantee covers, and what it does not](https://balazscsorba.com/blog/structured-outputs-json-schema-llm)
-   [Evaluating AI agents: grading trajectories, outcomes and reliability](https://balazscsorba.com/blog/evaluating-ai-agents-trajectories)
-   [LLM model migrations without regressions: deprecations, evals, shadow traffic](https://balazscsorba.com/blog/llm-model-migration-regression-testing)
-   [Context rot in long-running agents: clearing, compaction, memory and sub-agents](https://balazscsorba.com/blog/context-rot-compaction-long-running-agents)
-   [PDF parsing for RAG: layout pipelines, OCR and vision models compared](https://balazscsorba.com/blog/pdf-document-parsing-for-rag)
-   [Multilingual RAG for German and Hungarian: embeddings, compounds and cross-lingual search](https://balazscsorba.com/blog/multilingual-rag-german-hungarian)
-   [Text-to-SQL with LLMs: schema context, read-only roles and validation that holds](https://balazscsorba.com/blog/text-to-sql-llm-guardrails)
-   [Slopsquatting: when coding agents install packages that do not exist](https://balazscsorba.com/blog/slopsquatting-ai-package-hallucinations)
-   [Browser agents for E2E testing: let agents write Playwright tests, not run them](https://balazscsorba.com/blog/browser-agents-e2e-testing-playwright)
-   [Semantic caching for LLM apps: when reusing answers is safe, and when it is not](https://balazscsorba.com/blog/semantic-caching-llm-responses)
-   [Embedding quantization: binary, int8 and Matryoshka vectors without losing retrieval quality](https://balazscsorba.com/blog/embedding-quantization-binary-matryoshka)
-   [RAG poisoning: how a few documents can steer your assistant, and how to defend the knowledge base](https://balazscsorba.com/blog/rag-poisoning-knowledge-base-attacks)
-   [The A2A protocol explained: agent cards, tasks, and where it fits next to MCP](https://balazscsorba.com/blog/a2a-protocol-agent-interoperability)
-   [Self-hosting LLMs for GDPR: when it is required and what it costs](https://balazscsorba.com/blog/self-hosted-llm-gdpr-cost)
-   [OpenCode review: the open-source coding agent for any model](https://balazscsorba.com/blog/opencode)
-   [Coding agents and secrets: keep keys out of context, logs and commits](https://balazscsorba.com/blog/coding-agent-secrets-hygiene)
-   [Pydantic AI review: typed Python agents with validated output](https://balazscsorba.com/blog/pydantic-ai)
-   [llms.txt vs Markdown content negotiation: what agents actually fetch](https://balazscsorba.com/blog/llms-txt-vs-markdown-content-negotiation)
-   [Gemini CLI review: open source, but no longer free for individuals](https://balazscsorba.com/blog/gemini-cli)
-   [Temporal review: durable agents that survive crashes and wait for people](https://balazscsorba.com/blog/temporal)
-   [Zep review: agent memory on a temporal graph](https://balazscsorba.com/blog/zep)
-   [DeepEval review: pytest for LLM outputs, and the judge bill](https://balazscsorba.com/blog/deepeval)
-   [DSPy review: compile your prompts against a metric, not by hand](https://balazscsorba.com/blog/dspy)
-   [llama.cpp review: the local engine under Ollama and LM Studio](https://balazscsorba.com/blog/llama-cpp)
-   [Opik review: open-source tracing and evals, with a US-hosted cloud](https://balazscsorba.com/blog/opik)
-   [GraphRAG and knowledge-graph RAG: when a graph beats vector search](https://balazscsorba.com/blog/graphrag-knowledge-graph-rag)
-   [AI coding tools and the works council: when usage logs count as monitoring](https://balazscsorba.com/blog/works-council-ai-tools-austria-germany)
-   [E2B review: Firecracker sandboxes for agent code, billed per second](https://balazscsorba.com/blog/e2b)
-   [EU AI Act beyond Article 50: GPAI, high-risk dates and what to do now](https://balazscsorba.com/blog/eu-ai-act-gpai-high-risk-2026)
-   [Local text-to-speech at scale: narrating 96 articles with open models](https://balazscsorba.com/blog/local-text-to-speech-pipeline)
-   [One senior with coding agents versus a team: what the evidence says](https://balazscsorba.com/blog/ai-assisted-development-economics)
-   [DPIA for an LLM support assistant: a worked example under GDPR Art. 35](https://balazscsorba.com/blog/dpia-llm-feature-worked-example)
-   [Multimodal RAG with ColPali: page images, multi-vector costs, and when they win](https://balazscsorba.com/blog/multimodal-rag-colpali)
-   [RAG over code: AST chunking, repo maps and code embeddings that fit an agent](https://balazscsorba.com/blog/code-rag-repository-indexing)
-   [Spec-driven development for coding agents: agree the plan before the code](https://balazscsorba.com/blog/spec-driven-development-coding-agents)
-   [Browserbase and Stagehand reviewed: rented Chrome for AI agents](https://balazscsorba.com/blog/browserbase-stagehand)
-   [WebMCP: publishing tools instead of pixels](https://balazscsorba.com/blog/webmcp)
-   [Cross-encoder rerankers compared: Cohere, bge, Voyage, Jina and late interaction (2026)](https://balazscsorba.com/blog/reranking-models-compared)
-   [Vector search in Elasticsearch and OpenSearch: kNN, hybrid search and the license story](https://balazscsorba.com/blog/elasticsearch-opensearch-vector-search)
-   [OpenAI dots: what always-on agents will change, and what they will not](https://balazscsorba.com/blog/openai-dots-always-on-agents-impact)
-   [Ollama review: the friendly way to run open models](https://balazscsorba.com/blog/ollama)
-   [Guardrails AI: validating what the model returns](https://balazscsorba.com/blog/guardrails-ai)
-   [turbopuffer review: vector search built on object storage, and what it costs per query](https://balazscsorba.com/blog/turbopuffer)
-   [Table extraction for RAG: extraction layers, serialization and queries that hold](https://balazscsorba.com/blog/table-extraction-rag)
-   [Portkey: a production LLM gateway, reviewed for routing, guardrails and cost](https://balazscsorba.com/blog/portkey)
-   [Fine-tuning embedding models for your domain: hard negatives, losses and evals](https://balazscsorba.com/blog/embedding-fine-tuning-domain)
-   [SPLADE and learned sparse retrieval in practice: BM25, index size, latency](https://balazscsorba.com/blog/splade-learned-sparse-retrieval)
-   [MCP reference servers: what they demonstrate and what they omit](https://balazscsorba.com/blog/mcp-reference-servers)
-   [Knowledge graph extraction with LLMs: ontology, entity resolution, provenance](https://balazscsorba.com/blog/knowledge-graph-extraction-llm)
-   [Keeping a RAG index fresh: incremental indexing, CDC and blue/green re-embedding](https://balazscsorba.com/blog/incremental-indexing-cdc)
-   [Aider review: git-first pair programming in the terminal](https://balazscsorba.com/blog/aider)
-   [Claude Opus 5.5 takes #1 on Artificial Analysis, and medium effort is the real story](https://balazscsorba.com/blog/artificial-analysis-leaderboard-claude-opus-5-5)
-   [EU AI Act Article 50: what developers must do from 2 August 2026](https://balazscsorba.com/blog/eu-ai-act-article-50-developer-checklist)
-   [LanceDB: vector search that starts as a library](https://balazscsorba.com/blog/lancedb)
-   [pgvector, reviewed: the vector database you do not have to run](https://balazscsorba.com/blog/pgvector)
-   [Mem0: what an agent memory layer costs per turn](https://balazscsorba.com/blog/mem0)
-   [Typed decisions for LLM routing and triage: calibrated confidence with Jev](https://balazscsorba.com/blog/jev-typed-decisions-llm-routing)
-   [OpenAI Agents SDK: a small agent runtime with sharp edges](https://balazscsorba.com/blog/openai-agents-sdk)
-   [Designing memory for AI agents: tiers, write rules, poisoning and GDPR](https://balazscsorba.com/blog/ai-agent-memory-design)
-   [OpenHands: the open-source coding agent you operate](https://balazscsorba.com/blog/openhands)
-   [Milvus review: the most complete vector database to operate](https://balazscsorba.com/blog/milvus-zilliz)
-   [Microsoft GraphRAG: a knowledge-graph RAG priced up front](https://balazscsorba.com/blog/graphrag)
-   [Harness engineering: guides and sensors that make agent PRs mergeable](https://balazscsorba.com/blog/harness-engineering-coding-agents)
-   [Cursor reviewed: an AI code editor billed past its sticker price](https://balazscsorba.com/blog/cursor)
-   [Prompt injection defense: the lethal trifecta and six design patterns](https://balazscsorba.com/blog/prompt-injection-lethal-trifecta-patterns)
-   [Claude Code: the terminal coding agent, reviewed](https://balazscsorba.com/blog/claude-code)
-   [OpenAI Codex CLI: the agent that treats permissions as a config file](https://balazscsorba.com/blog/openai-codex-cli)
-   [GDPR LLM data residency: region controls, zero retention, EU options](https://balazscsorba.com/blog/gdpr-llm-api-eu-data-residency)
-   [Top 20 ways to cut coding-agent tokens: rtk, lean-ctx, Serena and more, ranked by evidence](https://balazscsorba.com/blog/token-saving-tools-coding-agents-top-20)
-   [Firecrawl: a web crawling API reviewed for RAG pipelines](https://balazscsorba.com/blog/firecrawl)
-   [Reducing LLM hallucinations in production: grounding, citations and knowing when to say no](https://balazscsorba.com/blog/llm-hallucination-grounding-citations)
-   [Semgrep: static analysis that fits in a pull request](https://balazscsorba.com/blog/semgrep)
-   [Langfuse review: tracing, prompts and evals you can host yourself](https://balazscsorba.com/blog/langfuse)
-   [MCP security checklist: tool poisoning, rug pulls and OAuth](https://balazscsorba.com/blog/mcp-server-security-checklist)
-   [GitHub Copilot coding agent: a review of the pull request agent](https://balazscsorba.com/blog/github-copilot-coding-agent)
-   [Multi-agent systems: when they beat one agent, and when they do not](https://balazscsorba.com/blog/multi-agent-systems-when-worth-it)
-   [Observability for LLM agents with OpenTelemetry: traces, tokens, PII and evals](https://balazscsorba.com/blog/agent-observability-opentelemetry)
-   [AI agent sandbox checklist: lessons from a CI intrusion](https://balazscsorba.com/blog/sandboxing-coding-agents-ci-checklist)
-   [Lakera Guard: prompt injection filtering at the request boundary](https://balazscsorba.com/blog/lakera-guard)
-   [detect-secrets: secret scanning with a committed baseline](https://balazscsorba.com/blog/detect-secrets)
-   [RAG in 2026: hybrid retrieval, agentic search, or just a 1M-token context?](https://balazscsorba.com/blog/rag-2026-hybrid-agentic-long-context)
-   [MCP 2026-07-28 migration guide: what changes for stateless MCP servers](https://balazscsorba.com/blog/mcp-2026-07-28-stateless-migration-guide)
-   [Human in the loop for AI agents: where to put approval gates](https://balazscsorba.com/blog/human-in-the-loop-ai-agents)
-   [A production RAG pipeline, step by step: chunking, hybrid search and reranking](https://balazscsorba.com/blog/rag-pipeline-chunking-hybrid-search-reranking)
-   [OpenRouter: one API key in front of every model you might call](https://balazscsorba.com/blog/openrouter)
-   [Chroma: simple vector search with one catch](https://balazscsorba.com/blog/chroma)
-   [Goose: the open-source agent you run on your own machine](https://balazscsorba.com/blog/goose-block)
-   [LangGraph: a low-level runtime for stateful agents](https://balazscsorba.com/blog/langgraph)
-   [The agent loop, explained: how coding agents run, and how to make them stop](https://balazscsorba.com/blog/agent-loop-explained)
-   [Mastra review: TypeScript agents with a real evaluation loop](https://balazscsorba.com/blog/mastra)
-   [LlamaIndex review: the widest data toolkit, with its centre of gravity already moved](https://balazscsorba.com/blog/llamaindex)
-   [Zed, reviewed: the editor that puts the agent in the window](https://balazscsorba.com/blog/zed)
-   [Pinecone: a review of the managed vector database](https://balazscsorba.com/blog/pinecone)
-   [Braintrust review: eval-first observability with a hard meter](https://balazscsorba.com/blog/braintrust)
-   [Promptfoo: LLM evals and red teaming from one YAML file](https://balazscsorba.com/blog/promptfoo)
-   [Arize Phoenix review: LLM tracing and evals you host yourself](https://balazscsorba.com/blog/arize-phoenix)
-   [Helicone: observability that sits in the request path](https://balazscsorba.com/blog/helicone)
-   [Skills, not prompts: how my coding agents take a bug from report to pull request](https://balazscsorba.com/blog/coding-agent-skills-workflow)
-   [vLLM reviewed for self-hosted inference](https://balazscsorba.com/blog/vllm)
-   [PII redaction in LLM pipelines: where to redact, how, and what GDPR says](https://balazscsorba.com/blog/pii-redaction-llm-pipelines)
-   [Rebuff: four layers of prompt injection detection, now archived](https://balazscsorba.com/blog/rebuff)
-   [Protect AI model scanning: Guardian is gone, ModelScan is not](https://balazscsorba.com/blog/protect-ai)
-   [Context engineering for coding agents: AGENTS.md, skills, MCP or CLI?](https://balazscsorba.com/blog/agents-md-skills-mcp-cli-decision-matrix)
-   [Cline, reviewed: an open coding agent that gives you every model and none of the guardrails](https://balazscsorba.com/blog/cline)
-   [pgvector or a vector database? How to choose vector storage in 2026](https://balazscsorba.com/blog/pgvector-vs-vector-databases)
-   [Building voice agents: realtime speech-to-speech or STT, LLM and TTS?](https://balazscsorba.com/blog/voice-agents-realtime-latency)
-   [Generative engine optimization in practice: a full GEO audit of my own site](https://balazscsorba.com/blog/generative-engine-optimization-audit)
-   [CrewAI review: crews, flows and the token bill](https://balazscsorba.com/blog/crewai)
-   [Weaviate: a vector database that has to win on search, not only on similarity](https://balazscsorba.com/blog/weaviate)
-   [Prompt caching and model routing: cutting LLM cost and latency](https://balazscsorba.com/blog/llm-cost-latency-prompt-caching-routing)
-   [WebMCP in practice: making a website agent-ready with declared tools](https://balazscsorba.com/blog/webmcp-agent-ready-website-guide)
-   [Playwright: one browser API for tests, scripts and agents](https://balazscsorba.com/blog/playwright)
-   [ElevenLabs: speech synthesis as an API](https://balazscsorba.com/blog/elevenlabs)
-   [Qdrant: a vector database built around filtering](https://balazscsorba.com/blog/qdrant)
-   [LangSmith: an observability product that grew into an agent platform](https://balazscsorba.com/blog/langsmith)
-   [Replicate, reviewed: a model API priced per second, with the sharp edges named](https://balazscsorba.com/blog/replicate)
-   [Unstructured review: parsing documents for RAG](https://balazscsorba.com/blog/unstructured)
-   [LiteLLM: the OpenAI-compatible gateway most platform teams end up running](https://balazscsorba.com/blog/litellm)
-   [Ragas review: the default RAG evaluation framework](https://balazscsorba.com/blog/ragas)
-   [AI code review is the bottleneck now: handling a flood of agent-written PRs](https://balazscsorba.com/blog/ai-generated-pr-review-bottleneck)
-   [AI agents are identities: least privilege for non-human users](https://balazscsorba.com/blog/ai-agent-identity-least-privilege)
-   [LLM evals for product features: from hand-read traces to a CI gate](https://balazscsorba.com/blog/llm-evals-for-product-features)
-   [Evaluating RAG: retrieval metrics, faithfulness and how to tell which half failed](https://balazscsorba.com/blog/rag-evaluation-metrics)
-   [Prompting vs RAG vs fine-tuning vs distillation: a decision guide for 2026](https://balazscsorba.com/blog/fine-tuning-vs-rag-vs-prompting)

[All articles →](https://balazscsorba.com/blog)

## Frequently asked questions

What is an MCP server?

The Model Context Protocol (MCP) is an open standard that lets AI assistants and coding agents use tools and data from other systems. An MCP server wraps a system – Jira, for example – in well-described tools, so an agent can search issues or log test runs without custom glue code.

Can AI agents work safely in an existing codebase?

Yes, if the guardrails are real. In my pipelines unit and end-to-end tests, static analysis and CI gates decide what ships – and every change still goes through human review.

Which AI tools and models do you work with?

Claude Code and agent skills, OpenCode and Codex day to day, and the Anthropic and OpenAI APIs for LLM features inside products.

Where are you based – and do you work remotely?

In Voitsberg, west of Graz in Styria, Austria. Remote across Europe and the UK, or hybrid in Styria.

Are you available?

Open for new projects. The quickest way to reach me is e-mail or LinkedIn.

Which languages do you work in?

English and Hungarian. Project communication, tickets, documentation and code are in English – I don’t work in German.

## Also on this site

-   [Code audit for AI-generated code](https://balazscsorba.com/expertise/code-audit)
-   [Legacy modernisation](https://balazscsorba.com/expertise/legacy-modernisation)
-   [Vue.js & Nuxt development](https://balazscsorba.com/expertise/vue-nuxt-developer)
-   [B2B e-commerce & PIM](https://balazscsorba.com/expertise/b2b-ecommerce-developer)
-   [Game](https://balazscsorba.com/game)

## Sounds like what you need?

Tell me about your project or role – I’d love to hear from you.

[Get in touch](mailto:contact@balazscsorba.com) [Connect on LinkedIn](https://www.linkedin.com/in/balazs-csorba)
