hr-management-portal: The HR System That Assumes an AI Will Run It
A Spring Boot HRIS with an MCP bridge, department-scoped JWT claims, and guardrails that make agentic HR workflows feel less like a demo and more like an operating model.
- This repo treats AI as a constrained operator for HR work, not as a chat layer pasted onto a portal.
- Its real novelty is the control plane: MCP tools, JWT claims, and department isolation enforce what the agent can touch.
- Employee and leave workflows are built like business systems with validation, summaries, and transaction records, not loose CRUD endpoints.
- The project’s bet is bigger than HR software: structured tool use may replace a lot of dashboard navigation in enterprise apps.
Why this HR portal is different
Most open-source HR systems start with screens. This one starts with an assumption: a human might never click those screens at all. The project exposes HR actions through a Model Context Protocol server, which means an agent can ask for work to be done as a tool call instead of driving a UI.
That changes the product shape. The portal is still a Spring Boot HRIS, but the interesting surface is the MCP bridge in leave-portal-mcp-server/. It turns ordinary HR operations, like employee lookup, department-scoped updates, and leave approval, into structured actions that an AI can invoke.
The result is not a chatbot glued to a database. It is a headless operating model for HR, where the interface is optional and the policy layer is mandatory.
The AI is not trusted. It is boxed in.
The best part of the repo is the restraint. Every MCP request still carries a user token, and that token is not just for login. The claims include employee and department identity, which lets the backend decide what the agent can see and modify before the business logic runs.
In plain English, the system is doing something many AI demos skip: it makes authorization explicit. The agent can ask for a department-wide action, but the backend still checks whether that request belongs in the caller’s department and role. That is the difference between a toy demo and a usable enterprise boundary.
What happens when an employee is created
Once you get past the security model, the business logic reads like a disciplined back office system. Employee creation is not just a row insert. The service validates the record, applies department defaults, and initializes the leave summary automatically so the employee starts with a usable balance state.
if (securityContextHelper.isHR()) {
if (!dto.departmentId().equals(securityContextHelper.getDepartmentId())) {
throw new BadRequestException("Access denied: HR can only create employees in their department");
}
}
leaveSummaryService.initializeForEmployee(employee);
That pattern matters. It means the application is not depending on a UI to keep data consistent. The service layer itself carries the rules, which is exactly where you want them if the same action might arrive from a browser, a REST client, or an AI tool.
The repo also leans on hard validation, including constrained employee fields and department-aware defaults. This is boring in the best possible way. The system is designed to reject bad state early, before it has a chance to become somebody else’s problem.
Leave management is built as a ledger, not just a form
The leave workflow is where the project stops looking like generic CRUD. It separates the request itself from the running balance. TimeOff stores the transaction. LeaveSummary stores the current state. That split is what lets the system reason about balances, approvals, and conflicts without rebuilding history on every read.
The guardrails are practical. The service rejects overlapping requests, blocks excessive back-dated abuse, and keeps the leave ledger aligned with the summary. That is the kind of invariant you want if an AI is allowed to touch the workflow, because the model can be wrong and the ledger still has to be right.
This is also where the project’s personality shows. It is not trying to be flashy. It is trying to make the difficult part, operational correctness, harder to break than the interface is to use.
What this stack is buying
The technology choices are straightforward, which is a strength here. Java 21, Spring Boot 3.5, Spring Security, PostgreSQL, and a Python MCP bridge are all mature pieces. None of them are experimental, and that is the point. The repo is building a control plane, not a prototype costume.
The Python MCP layer keeps the AI integration separate from the core Java domain. That separation matters because it reduces the risk of letting agent tooling leak into the business rules. The backend owns the policy. The bridge only translates intent into calls.
What this replaces, and what it does not
| Axis | Traditional open-source HRIS | This repo |
|---|---|---|
| Primary interface | Dashboards and forms | MCP tool calls plus API |
| Trust model | Human user navigating screens | Agent operating inside scoped JWT claims |
| Security boundary | Mostly page and role based | Department isolation enforced in the backend |
| Deployment style | UI-first portal | Headless HR system with optional UI |
| Best use case | Self-service HR workflows | Structured HR actions under automation |
| Weakness | Can be heavy and screen-centric | Less suited to broad self-service polish |
Compared with mainstream HRIS projects, this one is narrower and more opinionated. It does not try to win on breadth of modules or UI polish. It tries to make HR operations callable, automatable, and still bounded by policy.
That also means it is not trying to replace every HR portal use case. If the job is employee self-service at scale, more mature suites still have an edge. If the job is an agent making constrained, auditable changes inside a department, this design is sharper.
The bet
The strategic idea is simple. If MCP-style tooling becomes normal, enterprise software may stop treating the screen as the primary product surface. The valuable surface becomes the set of safe, structured actions an agent can take on behalf of a user.
This repo is a compact example of that future. It says the AI can run the workflow, but only if the workflow is already built like a system with rules, scopes, and receipts. That is the part worth noticing.