# TriNet MCP connector

The TriNet connector brings employees, emergency contacts, jobs, supervisors and employment details into Claude, ChatGPT, Cursor and the Elaichi Agent, so each person can look up and update people records inside their own TriNet access, with every change logged.

Source: https://elaichi.ai/connectors/trinet/

## Facts

| | |
| --- | --- |
| Application | TriNet |
| Category | HRIS |
| AI tools | 61 |
| Authentication | Connects with an API key |
| Bring your own OAuth app | No |
| MCP endpoint | https://api.elaichi.ai/mcp |
| Works with | Claude, ChatGPT, Cursor, any MCP client, and the Elaichi Agent |
| Tools advertised by name | No. Connected tools are never listed one by one, however few there are. The endpoint advertises `search_tools` and `execute_tool` instead |

## What you can ask once TriNet is connected

- List employees who joined this month with their supervisors
- Which employees are missing an emergency contact?
- Add Priya Shah as a new employee in Customer Success

## Connect TriNet in Elaichi

This happens once for the organization, before any client is involved.

1. Open Connections, choose Add connection, and pick TriNet.
2. Optionally set Share with, then press Connect.
3. Paste a TriNet API key. One person generates a token in TriNet and pastes it once. Everyone else works through Share with, and never sees it.

Credentials are vaulted and nobody, including the AI, reads them back. The connection becomes a toolbox immediately, so you can curate which TriNet tools are exposed, rename them, or freeze arguments before anyone points a client at it.

## TriNet MCP connector for Claude

Endpoint: https://api.elaichi.ai/mcp

1. Open Customize, then Connectors.
2. Press Add.
3. Name it, paste the MCP server URL, then Continue.
4. Sign in and approve.

On Team and Enterprise, an Owner adds it once. Everyone else turns it on for themselves.

## TriNet MCP connector for ChatGPT

Endpoint: https://api.elaichi.ai/mcp

1. Open Plugins, then press the + button.
2. Name it and paste the endpoint into Server URL.
3. Leave Authentication on OAuth, then tick the risk acknowledgement.
4. Press Create, then sign in and approve.

Works on the web today. The plugin directory lives at chatgpt.com/plugins.

## TriNet MCP connector for Cursor

Endpoint: https://api.elaichi.ai/mcp

1. Open `~/.cursor/mcp.json`.
2. Add the endpoint under `mcpServers`.
3. Reload Cursor, then sign in and approve.

Set up per machine, so repeat it on each computer you work from.

## Connect TriNet to any MCP client

Endpoint: https://api.elaichi.ai/mcp

1. Add the endpoint as a remote MCP server.
2. Sign in and approve.

The Elaichi Agent already has these tools, with nothing to set up.

## What the consent screen decides

Only Read is granted by default, which is not enough to call a TriNet tool. Over MCP there is no trusted place to confirm a write in the moment, so the consent screen is the standing approval rather than a formality. Grant Read and Run tools. Think hard before granting Delete, which reaches into connected apps and cannot be undone.

## What teams do with TriNet through Elaichi

### Set up a new hire in one go

HR. Create the employee in TriNet, add their name, contact details and emergency contact, and confirm it all landed without clicking through five screens.

### Keep emergency contacts current

HR. Ask which employees have no emergency contact on file, then update the missing ones in one pass after the annual reminder goes out.

### Fill in custom fields across the company

People Ops. When a new field such as a badge number or preferred name is added, update it for a whole group of employees at once instead of one record at a time.

### See who reports to whom

Managers. Pull the list of supervisors, jobs and employee roles for a department and get a plain answer about the reporting line before a reorg conversation.

### Get the employee list for account setup

IT. List active employees with their employment details and jobs so new accounts, hardware and licenses match what TriNet says on day one.

### Check addresses before shipping equipment

Workplace. Look up an employee's address and contact details in TriNet before sending a laptop or welcome kit, and catch a stale address before the courier does.

## Frequently asked questions

### How do I connect TriNet to Claude?

Connect TriNet in Elaichi first: paste in the API key from your TriNet account and Elaichi takes it from there, with no OAuth application to register and no client ID or secret to generate. Then in Claude open Customize, then Connectors, then Add, and paste the Elaichi endpoint https://api.elaichi.ai/mcp. Sign in as yourself and TriNet employees, contacts and jobs are available in your next conversation.

### Does TriNet work with ChatGPT and Cursor as well as Claude?

Yes. Once TriNet is connected in Elaichi, the same endpoint, https://api.elaichi.ai/mcp, works in Claude, ChatGPT, Cursor, any other MCP client and the Elaichi Agent. You connect TriNet once and every client you use picks it up.

### What can an AI agent actually do with my TriNet data?

With TriNet connected, an agent can list employees, look up a person's job, supervisor, address, employment details and biographical details, and pull up photos and company org details. It can also create a new employee, add names, contacts and emergency contacts, and update contacts, names, personal details and custom fields for many employees at once. Short, concrete asks work best, such as "list employees in Finance with their supervisors".

### Does connecting TriNet give the AI access to every employee record?

No. Every request to TriNet runs inside the access of the person who signed in, so someone who cannot see a record in TriNet cannot see it through an agent either. Elaichi can narrow that access further with restrictions, and it can never widen it beyond what TriNet already allows that person.

### Can my team share one TriNet connection?

Yes. One person connects TriNet with the API key and shares the connection with a team in Elaichi, and nobody else ever handles the key. Each teammate still signs in as themselves, so the audit log names the actual person behind every TriNet lookup or change.

### Can I stop an agent from changing employee records in TriNet?

Yes. In Elaichi you restrict TriNet actions individually, so you can allow looking up employees while blocking the creation of employees or the bulk update of contacts, names or custom fields. A restricted action is never shown to Claude, ChatGPT or any other client at all, so no prompt can reach it.

### What happens to a TriNet connection when someone leaves?

Offboarding a person in Elaichi ends their access to TriNet through every client at once. If they had shared a TriNet connection with a team, it keeps working for everyone else. Disconnecting TriNet once in Elaichi removes it from Claude, ChatGPT, Cursor and every other client together.

### Does the TriNet MCP connector work with Gemini, Codex, Claude Code or other MCP clients?

Yes. TriNet is reached over the same MCP endpoint every client uses, so anything that speaks MCP can call it — Gemini, Codex, Claude Code, Windsurf, Cline, Zed and OpenCode among them — alongside Claude, ChatGPT, Cursor, and the Elaichi Agent. The tools on offer and the access behind them are identical whichever client asks. Only the setup screen differs.

## All 61 TriNet tools

Every tool below is callable through https://api.elaichi.ai/mcp once TriNet is connected, subject to the toolbox it is in and the restrictions on the caller.

- **Create a TriNet employee** (Create). Add Employee (TriNet POST /v1/hire/{{company_id}}/employee). Takes no caller parameters. The companyId comes from the connection credential. Requires a JSON request body; TriNet does not publish the request schema, so no body_schema row exists.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet employees** (List). List All Employees (TriNet GET /v1/company/{{company_id}}/employees). Takes no caller parameters. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED. Beyond the general `read` scope, seven section scopes control which sections of this response are returned: `basic-read` -> departmentSplit, employementInfo, names; `hr-personal-read` -> emergencyContacts, homeAddress, employeeContacts, workEligibility; `hr-bioinfo-read` -> bioInfo; `hr-admin-read` -> customFields; `hr-pay-read` -> payInfo; `hr-security-read` -> roles; `hr-natid-read` -> nationalIds. (`employementInfo` is TriNet's own spelling.) A credential holding only `read` still succeeds, with fewer sections.
- **Get single TriNet citizenship by ID** (Get). Get Citizenship (TriNet GET /v1/profile/{{company_id}}/{{id}}/citizenship). Caller must supply `id`. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **TriNet custom fields bulk update** (Update). Update Custom Fields (TriNet PUT /v1/manage-employee/{{company_id}}/{{query.employee_id}}/custom-fields). Caller must supply `employee_id`. The companyId comes from the connection credential. Requires a JSON request body; TriNet does not publish the request schema, so no body_schema row exists.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **Get single TriNet department split by ID** (Get). Department Split (TriNet GET /v1/department/{{company_id}}/{{id}}/department-split). Caller must supply `id`. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **Create a TriNet emergency contact** (Create). Add Emergency Contact (TriNet POST /v1/profile/{{company_id}}/{{query.employee_id}}/emergency-contacts). Caller must supply `employee_id`. The companyId comes from the connection credential. Requires a JSON request body; TriNet does not publish the request schema, so no body_schema row exists.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet emergency contacts** (List). List Emergency Contact (TriNet GET /v1/profile/{{company_id}}/{{query.employee_id}}/emergency-contacts). Caller must supply `employee_id`. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **TriNet emergency contacts bulk update** (Update). Update Emergency Contact (TriNet PUT /v1/profile/{{company_id}}/{{query.employee_id}}/emergency-contacts). Caller must supply `employee_id`. The companyId comes from the connection credential. Requires a JSON request body; TriNet does not publish the request schema, so no body_schema row exists.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **Create a TriNet name** (Create). Add Employee Name (TriNet POST /v1/identity/{{company_id}}/{{query.employee_id}}/names). Caller must supply `employee_id`. The companyId comes from the connection credential. Requires a JSON request body; TriNet does not publish the request schema, so no body_schema row exists.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **TriNet names bulk update** (Update). Update Employee Name (TriNet PUT /v1/identity/{{company_id}}/{{query.employee_id}}/names). Caller must supply `employee_id`. The companyId comes from the connection credential. Requires a JSON request body; TriNet does not publish the request schema, so no body_schema row exists.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet employment details** (List). Job Details (TriNet GET /v1/identity/{{company_id}}/{{query.employee_id}}/employment-details). Caller must supply `employee_id`. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet addresses** (List). Get Home Address (TriNet GET /v1/identity/{{company_id}}/{{query.employee_id}}/addresses). Caller must supply `employee_id`. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **Create a TriNet contact** (Create). Add Personal Contacts (TriNet POST /v1/identity/{{company_id}}/{{query.employee_id}}/contacts). Caller must supply `employee_id`. The companyId comes from the connection credential. Requires a JSON request body; TriNet does not publish the request schema, so no body_schema row exists.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet contacts** (List). Get Work Contact (TriNet GET /v1/identity/{{company_id}}/{{query.employee_id}}/contacts). Caller must supply `employee_id`. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **TriNet contacts bulk update** (Update). Update Personal Contacts (TriNet PUT /v1/identity/{{company_id}}/{{query.employee_id}}/contacts). Caller must supply `employee_id`. The companyId comes from the connection credential. Requires a JSON request body; TriNet does not publish the request schema, so no body_schema row exists.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet biographical details** (List). Get Personal Identification Info (TriNet GET /v1/identity/{{company_id}}/{{query.employee_id}}/biographical-details). Caller must supply `employee_id`. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **TriNet personals bulk update** (Update). Update Personal Identification (TriNet PUT /v1/identity/{{company_id}}/{{query.employee_id}}/personals). Caller must supply `employee_id`. The companyId comes from the connection credential. Requires a JSON request body; TriNet does not publish the request schema, so no body_schema row exists.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **Get single TriNet photo by ID** (Get). Get Profile Photo By ID (TriNet GET /v1/profile/{{company_id}}/{{query.employee_id}}/photos/{{id}}). Caller must supply `id`, `employee_id`. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet photos** (List). List Profile Photos (TriNet GET /v1/profile/{{company_id}}/{{query.employee_id}}/photos). Caller must supply `employee_id`. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet employee roles** (List). List Roles (TriNet GET /v1/manage-employee/{{company_id}}/{{query.employee_id}}/employee-roles). Caller must supply `employee_id`. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet jobs** (List). List Job Codes (TriNet GET /v1/company/{{company_id}}/jobs). Takes no caller parameters. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet manage company org details** (List). Get Company Details (TriNet GET /v1/manage-company/{{company_id}}/org-details). Takes no caller parameters. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet manage company custom fields** (List). List Company Custom Fields (TriNet GET /v1/manage-company/{{company_id}}/custom-fields). Takes no caller parameters. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet supervisors** (List). List Supervisors (TriNet GET /v1/company/{{company_id}}/supervisors). Takes no caller parameters. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet workers comp codes** (List). List Workers Comp Codes (TriNet GET /v1/company/{{company_id}}/workers-comp-codes). Takes no caller parameters. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet benefit classes** (List). List Company Benefit Classes (TriNet GET /v1/company/{{company_id}}/benefit-classes). Takes no caller parameters. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet benefits** (List). List Company Benefits (TriNet GET /v1/company/{{company_id}}/benefits). Takes no caller parameters. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet savings plans** (List). List Company Savings Plans (TriNet GET /v1/company/{{company_id}}/savings-plans). Takes no caller parameters. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet platform company employee changes** (List). List Company and Employee Changes (TriNet GET /v1/platform/company-employee-changes). Takes no caller parameters.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet platform company changes** (List). List Company Changes (TriNet GET /v1/platform/company-changes). Takes no caller parameters.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet employee changes** (List). List Employee Changes (TriNet GET /v1/company/{{company_id}}/employee-changes). Takes no caller parameters. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **Get single TriNet department by ID** (Get). Get Department by ID (TriNet GET /v1/company/{{company_id}}/departments/{{id}}). Caller must supply `id`. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet departments** (List). List Departments (TriNet GET /v1/company/{{company_id}}/departments). Takes no caller parameters. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **Create a TriNet manage company department** (Create). Add Department (TriNet POST /v1/manage-company/{{company_id}}/departments). Takes no caller parameters. The companyId comes from the connection credential. Requires a JSON request body; TriNet does not publish the request schema, so no body_schema row exists.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **Update a TriNet manage company department by ID** (Update). Update Department (TriNet PUT /v1/manage-company/{{company_id}}/departments/{{id}}). Caller must supply `id`. The companyId comes from the connection credential. Requires a JSON request body; TriNet does not publish the request schema, so no body_schema row exists.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **Get single TriNet location by ID** (Get). Get Location by ID (TriNet GET /v1/company/{{company_id}}/locations/{{id}}). Caller must supply `id`. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet locations** (List). List Locations (TriNet GET /v1/company/{{company_id}}/locations). Takes no caller parameters. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **Create a TriNet manage company location** (Create). Add Location (TriNet POST /v1/manage-company/{{company_id}}/locations). Takes no caller parameters. The companyId comes from the connection credential. Requires a JSON request body; TriNet does not publish the request schema, so no body_schema row exists.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet pay codes** (List). List Pay Codes (TriNet GET /v1/company/{{company_id}}/pay-codes). Takes no caller parameters. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **Get single TriNet paygroup by ID** (Get). Get Pay Group by ID (TriNet GET /v1/company/{{company_id}}/paygroups/{{id}}). Caller must supply `id`. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet paygroups** (List). List Pay Groups (TriNet GET /v1/company/{{company_id}}/paygroups). Takes no caller parameters. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **Get single TriNet payrun by ID** (Get). Get Payrun by ID (TriNet GET /v1/payroll/{{company_id}}/payruns/{{id}}). Caller must supply `id`. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet payruns** (List). List Payruns (TriNet GET /v1/payroll/{{company_id}}/payruns). Takes no caller parameters. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet paychecks** (List). List Employee's Pay Checks (TriNet GET /v1/payroll/{{company_id}}/{{query.employee_id}}/paychecks). Caller must supply `employee_id`. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **Get single TriNet paycheck detail by ID** (Get). Employee's Pay Check Details (TriNet GET /v1/payroll/{{company_id}}/{{query.employee_id}}/paycheck-details/{{id}}). Caller must supply `id`, `employee_id`. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **Get single TriNet pay info by ID** (Get). Get Employee's Pay Info (TriNet GET /v1/payroll/{{company_id}}/{{id}}/pay-info). Caller must supply `id`. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **Create a TriNet contribution** (Create). Add/Update Retirement Elections (TriNet POST /v1/retirement-plan/{{company_id}}/{{query.employee_id}}/contributions). Caller must supply `employee_id`. The companyId comes from the connection credential. Requires a JSON request body; TriNet does not publish the request schema, so no body_schema row exists.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **List all TriNet contributions** (List). Retirement Plan Elections (TriNet GET /v1/retirement-plan/{{company_id}}/{{query.employee_id}}/contributions). Caller must supply `employee_id`. The companyId comes from the connection credential.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **TriNet contributions bulk update** (Update). Update Retirement Elections (TriNet PUT /v1/retirement-plan/{{company_id}}/{{query.employee_id}}/contributions). Caller must supply `employee_id`. The companyId comes from the connection credential. Requires a JSON request body; TriNet does not publish the request schema, so no body_schema row exists.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- **Create a TriNet contributions loan deduction** (Create). Add Loan Deduction (TriNet POST /v1/retirement-plan/{{company_id}}/{{query.employee_id}}/contributions/loan-deductions). Caller must supply `employee_id`. The companyId comes from the connection credential. Requires a JSON request body; TriNet does not publish the request schema, so no body_schema row exists.

Vendor gaps: TriNet publishes no query or paging parameters for any endpoint, and no per-endpoint 200 schema, so `response_path` (`data`) is taken from TriNet's generic response envelope and is UNVERIFIED.
- ...and 11 more tools. Call `tools/list` via the MCP endpoint, or see the full catalog via the API, for the complete set.
