Developers

Teamso MCP Server

Connect Claude, Cursor, Windsurf or any other MCP client to your Teamso account: request leave, approve requests, manage your goals, open your payslips, search the guides and work with every other module your permissions allow.

What is MCP?

The Model Context Protocol (MCP) is an open standard that lets AI assistants call tools in other systems. Teamso's hosted MCP server at https://mcp.teamso.com/v1 serves clients that support Streamable HTTP and custom headers.

Claude Desktop needs OAuth for remote connections, so it uses the local npm package (@teamso/teamso-mcp). Every request runs with your personal access token and your permissions; the server stores nothing.

Links

Setup

Pick your client. They all use the same token: in Teamso, open MCP access at the very bottom of the left menu, create a token and put it in place of tms_pat_... in the examples.

Cursor

  1. In Cursor, run Cmd+Shift+P → Open MCP settings.
  2. Add the server to ~/.cursor/mcp.json:
~/.cursor/mcp.json
{
  "mcpServers": {
    "teamso": {
      "url": "https://mcp.teamso.com/v1",
      "headers": {
        "Authorization": "Bearer tms_pat_..."
      }
    }
  }
}

Restart Cursor; the Teamso tools appear in the MCP list.

Claude Code

One terminal command:

bash
claude mcp add --transport http teamso https://mcp.teamso.com/v1 --header "Authorization: Bearer tms_pat_..."

To check, run claude mcp get teamso or type /mcp inside Claude Code.

bash
claude mcp get teamso

Claude Desktop

Remote custom connectors in Claude Desktop need OAuth; Teamso uses tokens, so use the local package. Add it to claude_desktop_config.json and fully quit and reopen Claude Desktop:

claude_desktop_config.json
{
  "mcpServers": {
    "teamso": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "@teamso/[email protected]"
      ],
      "env": {
        "TEAMSO_ACCESS_TOKEN": "tms_pat_..."
      }
    }
  }
}

Pin the version (@1.2.1): an unpinned npx keeps running an old cached build. Do not add the URL under Connectors.

The local package talks to the Teamso API directly and offers all HR tools; the distributor account's content tools are only on the hosted server.

Claude Desktop connection issues

  • Configuration error: the entry needs type, command, args and env.
  • Tools missing: install Node.js 20 or later, then fully quit Claude Desktop from the menu and reopen it.
  • Calls fail at once: pin the package version; npx may be using an old cached build.
  • Do not add a timeout field; the client may ignore it.

Windsurf

Windsurf → Settings → MCP (~/.codeium/windsurf/mcp_config.json). Windsurf expects the address in serverUrl:

mcp_config.json
{
  "mcpServers": {
    "teamso": {
      "serverUrl": "https://mcp.teamso.com/v1",
      "headers": {
        "Authorization": "Bearer tms_pat_..."
      }
    }
  }
}

Other clients

Any client with Streamable HTTP connects to https://mcp.teamso.com/v1 with the Authorization: Bearer tms_pat_... header. Clients that only speak stdio reach the hosted server through mcp-remote:

mcp.json
{
  "mcpServers": {
    "teamso": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://mcp.teamso.com/v1",
        "--header",
        "Authorization:Bearer ${TEAMSO_TOKEN}"
      ],
      "env": {
        "TEAMSO_TOKEN": "tms_pat_..."
      }
    }
  }
}

Clients that can only connect with OAuth are not supported.

Authentication

Teamso MCP uses a personal access token (tms_pat_...). Create it in Teamso on the MCP access page at the very bottom of the left menu; it is shown only once, when it is created.

HTTP
Authorization: Bearer tms_pat_...
  • The token acts as you, with your current permissions: what you cannot see on screen you cannot see through MCP either.
  • Every request carries the Authorization: Bearer tms_pat_... header; the hosted server stores nothing and forwards the request to the Teamso API.
  • Validity is 30 days, 90 days, 1 year or unlimited, and a user can have up to 10 active tokens; you can revoke a token on the same page at any time.
  • Password, session and sign-in channel (phone, email) changes, token management, integration keys and SSI credentials, company security settings, support access, company deletion and webhook changes are not available with a token (403 ACCESS_DENIED).
  • If your company restricts IP addresses, token requests follow that rule too; the hosted server forwards your real client IP in signed form.
  • Writes made with a token are recorded in the audit log with MCP as the source.
  • The token stops working if the user is deactivated or moves to another company.

Available tools

The hosted server and the npm package offer the same 34 tools. Every tool has typed input and output schemas and returns structuredContent plus a short text answer. Which tools you can use depends on your role and permissions.

Help

Searches the Teamso how-to guides. Reads the public guide bundle instead of calling the API.

ToolWhat it does
search_help_articlesSearches the Teamso guides by keyword; filters by module and role.
get_help_articleReturns a full guide with its steps.
list_help_modulesLists the modules that have guides, with each module's article titles and ids.

Account

Returns the token owner and their permissions.

ToolWhat it does
get_meYour name, email, company, roles, permission codes, manager, department and position.

Leave

Creating and cancelling a leave request is confirmed with an SMS code sent to your phone: the code is valid for 3 minutes and uses digital credit.

ToolWhat it does
list_leave_typesLeave types you can request and the remaining balance of each.
get_my_leave_balanceA summary of your leave balance: remaining days per type.
calculate_leave_daysCalculates how many working days a date range takes and the return-to-work date, using your working calendar and public holidays.
request_leave_otpSends a confirmation code to your phone (valid for 3 minutes, uses SMS credit).
create_leave_requestVerifies the SMS code, recalculates the days and submits the request to the approval chain.
list_my_leavesYour own leave requests, filterable by date and status.
cancel_leave_requestDeletes a leave request after SMS confirmation; requires the leave delete permission.

Approvals

Leave requests where it is your turn to decide.

ToolWhat it does
list_pending_approvalsLeave requests waiting for your approval.
approve_or_reject_leaveApproves or rejects a request after checking that it is your turn to decide. A rejection needs a reason.

Employees

Only employees you are allowed to see.

ToolWhat it does
search_employeesFinds active colleagues by name or email (accent-insensitive). Without access to the company directory it searches the employees you are responsible for.
get_employee_profileA colleague's work profile: branch, department, position, manager, work location and contact details (the phone number is masked unless you may read it).

Performance

Goals are linked to a period by its name (the title from list_performance_periods); list the periods before the goal tools.

ToolWhat it does
list_performance_periodsPerformance periods, goal entry windows and the evaluation scale.
list_my_goalsYour goals in the period and the actions available on each.
list_team_goalsGoals of the employees you manage or assigned goals to (drafts excluded), with the approvals you can give on each.
create_user_goalAdds a draft goal for yourself or a direct report (performance admins: for anyone).
send_goals_to_approvalSends your draft (PENDING) goals to your manager for approval.
approve_goalApproves a goal that is waiting for approval.
revise_and_approve_goalRevises a goal (name, description, weight, target) and approves it.
update_goal_actual_valueEnters your actual value on a goal under evaluation.
update_manager_actual_valueEnters the achieved value of an employee's goal as their direct manager or an admin.
approve_goal_evaluationApproves an employee's evaluation for the period at your approval step; at the last step Teamso computes the final score.

Communication

Announcements visible to you.

ToolWhat it does
list_announcementsCompany and shuttle announcements visible to you, newest first.

Payroll

Only your own payslips.

ToolWhat it does
list_my_payslipsYour e-payslips and their status, filterable by month or year.
get_payslip_pdfReturns a payslip PDF as an embedded resource.

All modules

The rest of Teamso (expenses, requests, overtime, time tracking, payroll, recruiting, inventory, settings...) through the generic API tools. Only the endpoints your own permissions allow are listed and callable; the read tool cannot change data and the write tool shows a preview first.

ToolWhat it does
find_api_endpointsSearches the Teamso API endpoints your permissions allow by keyword (Turkish or English), module, HTTP method or effect (read, write, delete). Each result has the endpoint id, a summary, its effect and whether it needs an SMS code or returns a file.
list_api_modulesLists the modules you can use and how many endpoints each one offers you.
describe_api_endpointShows an endpoint's parameters, body schema, response type, whether it needs an SMS code, and a ready-made example call.
call_api_readRuns read endpoints only and returns the data. The request is marked read-only, so Teamso refuses anything that would change data. Large lists are shortened; files (PDF, Excel, CSV, images) come back embedded, up to 8 MB.
call_api_writeCreates, changes or deletes records. Without confirm it sends nothing and returns a preview of the request with a schema check; it runs with confirm=true only after you agree. Takes otp_code for actions that need an SMS code and uploads files as base64 (10 MB in total).
request_sms_codeAfter you confirm an action that needs an SMS code, sends a 6-digit verification code to your phone (valid for 3 minutes, uses SMS credit).

On the hosted server the distributor account also sees the Landing CMS content tools (landing pages, user stories, e-books, webinars, references); these tools are available to the distributor account only. The hosted server also offers the guides as MCP resources (teamso://how-to/...).

Ready-made prompts

Next to the tools, the server publishes MCP prompts (prompts/list, prompts/get); your client shows them as slash commands or in a prompt picker. A prompt only steers the assistant through the tools: every write still needs your confirmation, and a leave request still needs the SMS code.

PromptArgumentsWhat it does
request_leave
start (optional)First day of leave: yyyy-MM-dd or words like “tomorrow” (Turkey time).
end (optional)Last day of leave (yyyy-MM-dd); empty means the same day as start.
leave_type (optional)Leave type name, e.g. “Annual leave”; empty means annual leave.
note (optional)Note for the approver.
Creates a leave request for the signed-in user: picks the leave type, shows the working days and the remaining balance, asks you to confirm, then sends the request with the SMS code. Missing dates are asked for.
review_pending_approvalsTakes no arguments.
Lists the leave requests waiting for your approval as a table and asks you, request by request, whether to approve or reject; it never decides for you. A rejection needs a reason.

On the hosted server the distributor account also sees the Landing CMS content prompts (seo_landing_page, translate_marketing_content); the hosted server gets them from the Teamso API.

All modules

The ready-made tools on this page cover the most common tasks. For everything else (expenses, requests, overtime, attendance, time tracking, shifts, recruiting, onboarding, inventory, document approval, surveys, reports, company settings...) the assistant uses the generic API tools. They read the Teamso API's endpoint catalog for you: only the endpoints your own permissions allow are listed and callable. If you cannot add leave, for example, the assistant cannot add leave through MCP either.

How it works

  1. find_api_endpoints or list_api_modules finds the right endpoint.
  2. describe_api_endpoint returns its parameters, body schema and whether it needs an SMS code.
  3. Reads use call_api_read, which returns the data directly.
  4. Changes use call_api_write: it shows a preview first and runs with confirm: true only after you agree.

A search returns endpoint ids (METHOD /path) and the effect of each endpoint:

tools/call · Request
{
  "name": "find_api_endpoints",
  "arguments": {
    "query": "masraf",
    "side_effect": "read"
  }
}
Response
{
  "structuredContent": {
    "query": "masraf",
    "sideEffect": "read",
    "page": 1,
    "size": 20,
    "total": 2,
    "totalPages": 1,
    "endpoints": [
      {
        "id": "GET /expense-form/{id}",
        "module": "EXPENSE",
        "summary": "Masraf formu ayrıntısı",
        "sideEffect": "read",
        "smsCodeRequired": "never",
        "fileResponse": false
      },
      {
        "id": "GET /expense-form/listPagination",
        "module": "EXPENSE",
        "summary": "Masraf formları (sayfalı)",
        "sideEffect": "read",
        "smsCodeRequired": "never",
        "fileResponse": false
      }
    ]
  }
}

A read uses the id and the path values. The request carries the X-Teamso-Mcp-Intent: read header, and Teamso refuses (403) any request with that header that would change data.

tools/call · Request
{
  "name": "call_api_read",
  "arguments": {
    "id": "GET /expense-form/{id}",
    "path_params": {
      "id": "8f1c…"
    }
  }
}

The write tool returns a preview first: the exact request, the result of the schema check, delete and SMS warnings, and a one-line summary. Nothing reaches Teamso at this stage, and a request that does not match the schema is not sent even with confirm: true.

tools/call · Request
{
  "name": "call_api_write",
  "arguments": {
    "id": "POST /demand",
    "body": {
      "demandTypeId": "3b7e…",
      "message": "Yeni monitör talebi"
    }
  }
}
Response
{
  "structuredContent": {
    "mode": "preview",
    "endpoint": {
      "id": "POST /demand",
      "module": "DEMAND",
      "sideEffect": "write",
      "smsCodeRequired": "never"
    },
    "request": {
      "method": "POST",
      "path": "/demand"
    },
    "summary": "Changes data: POST /demand — Create a request",
    "validation": {
      "checked": true,
      "valid": true,
      "errors": []
    },
    "nextAction": {
      "tool": "call_api_write",
      "arguments": {
        "id": "POST /demand",
        "body": {
          "demandTypeId": "3b7e…",
          "message": "Yeni monitör talebi"
        },
        "confirm": true
      },
      "reason": "Only after the user explicitly confirms this preview."
    }
  },
  "content": [
    {
      "type": "text",
      "text": "## Preview — nothing has been sent\n\n**Changes data: POST /demand — Create a request**\n…"
    }
  ]
}

Once you agree, the assistant repeats the call with confirm: true. For actions that need an SMS code it first calls request_sms_code, asks you for the code and adds it as otp_code:

tools/call · Request
{
  "name": "call_api_write",
  "arguments": {
    "id": "POST /expense-form/{expenseFormId}/finalize",
    "path_params": {
      "expenseFormId": "8f1c…"
    },
    "confirm": true,
    "otp_code": "123456"
  }
}

Illustrative response; fields vary by tool.

Safety rules

  • Only endpoint ids from the catalog can be called; there are no free-form URLs. Login, token, password and security settings endpoints are listed for no one.
  • Every request runs with the token owner's Teamso permissions, so the assistant cannot do anything you cannot do on screen. A request without permission is refused by the API with 403.
  • Changes never run without a preview and an explicit confirmation; deletes get an extra warning in the preview.
  • Actions that need an SMS code (e.g. finalizing an expense form) are confirmed with the code sent to your phone, as in the app.
  • File responses come back embedded, up to 8 MB; uploads go in as base64, at most 10 files and 10 MB in total.
  • Results over 40,000 characters are cut to the records that fit and marked truncated: true; nothing is cut silently.

Choosing tool groups

To give your assistant fewer tools, add ?toolsets= to the server address (or send the X-Teamso-Toolsets header). The local package takes the same selection from the TEAMSO_TOOLSETS environment variable. The default is every tool; an unknown group name is an error.

bash
claude mcp add --transport http teamso https://mcp.teamso.com/v1?toolsets=core,leave,api --header "Authorization: Bearer tms_pat_..."

Groups: core, help, leave, approvals, employees, performance, communication, payroll, api

Request and response contract

Tools are called with MCP tools/call. Input is validated against JSON Schema 2020-12; a successful result has structuredContent (typed data for chaining) and content (a short summary for clients that only show text).

tools/call · Request
{
  "name": "calculate_leave_days",
  "arguments": {
    "leave_type_id": "6f1c…",
    "start": "2026-11-02",
    "end": "2026-11-04"
  }
}

When another tool has to follow, the result carries nextAction: the tool to call, its arguments and why. The leave flow is an example: calculate_leave_days → request_leave_otp → create_leave_request.

Response
{
  "structuredContent": {
    "request": {
      "leaveTypeId": "6f1c…",
      "leaveTypeName": "Yıllık İzin",
      "start": "2026-11-02 09:00",
      "end": "2026-11-04 18:00",
      "workingDays": 3,
      "returnToWorkDate": "2026-11-05 09:00"
    },
    "remainingDays": 14,
    "remainingAfterRequest": 11,
    "canRequest": true,
    "problems": [],
    "nextAction": {
      "tool": "request_leave_otp",
      "arguments": {},
      "reason": "Creating the request needs an SMS code. After the user confirms these days, send the code, then call create_leave_request with the same leave_type_id, start, end and the otp_code."
    }
  },
  "content": [
    {
      "type": "text",
      "text": "## Yıllık İzin: 3 days\n\n- **Dates:** …\n- **Back at work:** 2026-11-05 09:00\n…"
    }
  ]
}

Illustrative response; fields vary by tool.

Errors come back with isError: true and a text that says what to do, ending with the Teamso API HTTP status and message_code (e.g. CREDIT_INSUFFICIENT, ITEM_NOT_FOUND).

Error
{
  "isError": true,
  "content": [
    {
      "type": "text",
      "text": "Your company does not have enough digital (SMS) credit for this step. Ask your Teamso administrator to top up credits.\n\n_Teamso API: HTTP 200 · `CREDIT_INSUFFICIENT`_"
    }
  ]
}

Dates: leave uses yyyy-MM-dd HH:mm Turkey time (a bare date starts at your shift start and ends at your shift end; 09:00 and 18:00 by default), goals and filters use yyyy-MM-dd, payroll terms yyyy-MM or yyyy.

get_payslip_pdf returns the payslip as an embedded application/pdf resource (base64).

Examples

Ask your assistant in plain language; it calls the tools in order.

Request leave

“I'd like annual leave from next Monday to Wednesday.”

list_leave_typescalculate_leave_daysrequest_leave_otpcreate_leave_request

Approval queue

“Show the leave requests waiting for me and approve Ayşe's.”

list_pending_approvalsapprove_or_reject_leave

Goals

“Add a sales goal weighted 40 percent to the 2026 Q4 period and send it for approval.”

list_performance_periodscreate_user_goalsend_goals_to_approval

Payslip

“Open my September payslip.”

list_my_payslipsget_payslip_pdf

Help

“How do I enter an overtime request?”

search_help_articlesget_help_article

Expense summary

“Summarize my expenses this month and my open requests.”

find_api_endpointsdescribe_api_endpointcall_api_read

Create a request

“Create a request for a new monitor.”

find_api_endpointsdescribe_api_endpointcall_api_write

How it works

  1. The assistant sends the tool call with your token to https://mcp.teamso.com/v1.
  2. The server forwards the request to the Teamso API on your behalf; your permissions and company rules (IP restrictions, approval chains, SMS confirmation) apply as usual.
  3. The answer returns to the assistant as typed data and short text. The server is stateless: no session or token is stored.
  4. New permissions and rules in Teamso apply to the tools straight away; nothing needs reinstalling.

Tool reference

The parameters of every tool. Optional ones can be left out.

search_help_articles

HelpRead

Searches the Teamso guides by keyword; filters by module and role.

ParameterTypeRequiredDescription
querystringYesText to search for.
lang"tr" | "en"NoGuide language; default tr.
modulestringNoModule id from list_help_modules, e.g. leave.
role"ADMIN" | "MANAGER" | "EMPLOYEE"NoOnly articles written for this role: ADMIN, MANAGER or EMPLOYEE.
limitintegerNoMaximum number of results (1-20, default 5).

get_help_article

HelpRead

Returns a full guide with its steps.

ParameterTypeRequiredDescription
idstringYesArticle id, e.g. performance.evaluation.
lang"tr" | "en"NoGuide language; default tr.

list_help_modules

HelpRead

Lists the modules that have guides, with each module's article titles and ids.

ParameterTypeRequiredDescription
lang"tr" | "en"NoGuide language; default tr.

get_me

AccountRead

Your name, email, company, roles, permission codes, manager, department and position.

Takes no parameters.

list_leave_types

LeaveRead

Leave types you can request and the remaining balance of each.

Takes no parameters.

get_my_leave_balance

LeaveRead

A summary of your leave balance: remaining days per type.

Takes no parameters.

calculate_leave_days

LeaveRead

Calculates how many working days a date range takes and the return-to-work date, using your working calendar and public holidays.

ParameterTypeRequiredDescription
leave_type_idstringYesLeave type id from list_leave_types.
startstringYesStart, Turkey time: yyyy-MM-dd (shift start, 09:00 by default) or yyyy-MM-dd HH:mm.
endstringYesEnd, Turkey time: yyyy-MM-dd (shift end, 18:00 by default) or yyyy-MM-dd HH:mm.

request_leave_otp

LeaveWrite

Sends a confirmation code to your phone (valid for 3 minutes, uses SMS credit).

Takes no parameters.

create_leave_request

LeaveWrite

Verifies the SMS code, recalculates the days and submits the request to the approval chain.

ParameterTypeRequiredDescription
leave_type_idstringYesLeave type id from list_leave_types.
startstringYesStart, Turkey time: yyyy-MM-dd (shift start, 09:00 by default) or yyyy-MM-dd HH:mm.
endstringYesEnd, Turkey time: yyyy-MM-dd (shift end, 18:00 by default) or yyyy-MM-dd HH:mm.
descriptionstringNoDescription; required by some leave types.
otp_codestringYesThe 6-digit SMS code from request_leave_otp.

list_my_leaves

LeaveRead

Your own leave requests, filterable by date and status.

ParameterTypeRequiredDescription
fromstringNoFrom this date (yyyy-MM-dd).
tostringNoUp to this date (yyyy-MM-dd).
status"pending_approval" | "approved" | "rejected" | "awaiting_usage_approval" | "completed" | "awaiting_document"NoFilters by leave status: in approval, approved, rejected, awaiting usage approval, completed, awaiting a document.
limitintegerNoMaximum number of records (1-100, default 20).

cancel_leave_request

LeaveDestructive

Deletes a leave request after SMS confirmation; requires the leave delete permission.

ParameterTypeRequiredDescription
leave_idstringYesLeave id from list_my_leaves.
otp_codestringYesThe 6-digit SMS code from request_leave_otp.

list_pending_approvals

ApprovalsRead

Leave requests waiting for your approval.

Takes no parameters.

approve_or_reject_leave

ApprovalsDestructive

Approves or rejects a request after checking that it is your turn to decide. A rejection needs a reason.

ParameterTypeRequiredDescription
leave_idstringYesLeave id from list_pending_approvals.
approvebooleanYestrue approves, false rejects.
reasonstringNoRejection reason; required when rejecting.

search_employees

EmployeesRead

Finds active colleagues by name or email (accent-insensitive). Without access to the company directory it searches the employees you are responsible for.

ParameterTypeRequiredDescription
querystringYesName, surname or email (Turkish characters optional).
limitintegerNoMaximum number of results (1-50, default 10).

get_employee_profile

EmployeesRead

A colleague's work profile: branch, department, position, manager, work location and contact details (the phone number is masked unless you may read it).

ParameterTypeRequiredDescription
user_idstringYesEmployee id from search_employees.

list_performance_periods

PerformanceRead

Performance periods, goal entry windows and the evaluation scale.

Takes no parameters.

list_my_goals

PerformanceRead

Your goals in the period and the actions available on each.

ParameterTypeRequiredDescription
periodstringYesPeriod name; exactly the title from list_performance_periods.

list_team_goals

PerformanceRead

Goals of the employees you manage or assigned goals to (drafts excluded), with the approvals you can give on each.

ParameterTypeRequiredDescription
periodstringYesPeriod name; exactly the title from list_performance_periods.
status"PENDING" | "WAITING_APPROVAL" | "APPROVED" | "REVISED_AND_APPROVED" | "IN_PROGRESS" | "EVALUATING" | "EVALUATED" | "EVALUATION_WAITING_APPROVAL" | "EVALUATION_IN_APPROVAL" | "COMPLETED" | "NOT_INCLUDED"NoFilters by goal status, e.g. WAITING_APPROVAL, EVALUATING.

create_user_goal

PerformanceWrite

Adds a draft goal for yourself or a direct report (performance admins: for anyone).

ParameterTypeRequiredDescription
periodstringYesPeriod name; exactly the title from list_performance_periods.
namestringYesGoal name.
weightnumberNoWeight (percent); required unless the criterion is OTHER.
scale_criterion"POINTS" | "QUANTITY" | "DAYS" | "CURRENCY" | "PERCENTAGE" | "OTHER"YesCriterion: points, quantity, days, currency, percentage or other (OTHER: a free-text goal).
target_valuenumberNoNumeric target; required unless the criterion is OTHER.
currencystringNoCurrency for CURRENCY, e.g. TRY.
other_textstringNoGoal text for OTHER.
descriptionstringNoDescription.
user_idstringNoGoal owner; empty means yourself. Anyone else must report to you directly (performance admins may set goals for anyone); id from search_employees.

send_goals_to_approval

PerformanceWrite

Sends your draft (PENDING) goals to your manager for approval.

ParameterTypeRequiredDescription
goal_idsstring[]YesIds of your draft (PENDING) goals to send, from list_my_goals.

approve_goal

PerformanceWrite

Approves a goal that is waiting for approval.

ParameterTypeRequiredDescription
goal_idstringYesGoal id from list_team_goals.

revise_and_approve_goal

PerformanceDestructive

Revises a goal (name, description, weight, target) and approves it.

ParameterTypeRequiredDescription
goal_idstringYesGoal id from list_team_goals.
namestringNoNew name.
descriptionstringNoNew description.
weightnumberNoNew weight.
target_valuenumberNoNew target value.

update_goal_actual_value

PerformanceDestructive

Enters your actual value on a goal under evaluation.

ParameterTypeRequiredDescription
goal_idstringYesGoal id from list_my_goals.
actual_valuenumberNoActual numeric value.
actual_textstringNoActual text for OTHER.

update_manager_actual_value

PerformanceDestructive

Enters the achieved value of an employee's goal as their direct manager or an admin.

ParameterTypeRequiredDescription
goal_idstringYesGoal id from list_team_goals.
valuenumberNoActual value entered by the manager.
textstringNoText for OTHER.

approve_goal_evaluation

PerformanceWrite

Approves an employee's evaluation for the period at your approval step; at the last step Teamso computes the final score.

ParameterTypeRequiredDescription
periodstringYesPeriod name; exactly the title from list_performance_periods.
user_idstringYesId of the employee being evaluated (the goal owner's userId in list_team_goals).

list_announcements

CommunicationRead

Company and shuttle announcements visible to you, newest first.

ParameterTypeRequiredDescription
limitintegerNoMaximum number of announcements (1-50, default 10).

list_my_payslips

PayrollRead

Your e-payslips and their status, filterable by month or year.

ParameterTypeRequiredDescription
termstringNoTerm: a month (yyyy-MM) or a whole year (yyyy).
limitintegerNoMaximum number of records (1-50, default 12).

get_payslip_pdf

PayrollRead

Returns a payslip PDF as an embedded resource.

ParameterTypeRequiredDescription
payslip_idstringYesPayslip id from list_my_payslips.

find_api_endpoints

All modulesRead

Searches the Teamso API endpoints your permissions allow by keyword (Turkish or English), module, HTTP method or effect (read, write, delete). Each result has the endpoint id, a summary, its effect and whether it needs an SMS code or returns a file.

ParameterTypeRequiredDescription
querystringNo1-3 keywords, e.g. masraf or expense form; every word must match.
modulestringNoModule code from list_api_modules, e.g. LEAVE, EXPENSE, PAY_SLIP.
method"GET" | "POST" | "PUT" | "PATCH" | "DELETE"NoOnly this HTTP method.
side_effect"read" | "write" | "delete" | "read_with_writes"NoOnly endpoints with this effect; read for safe lookups.
pageintegerNoPage number, starting at 1.
sizeintegerNoResults per page (1-50, default 20).
lang"tr" | "en"NoLanguage of module titles and summaries; default tr.

list_api_modules

All modulesRead

Lists the modules you can use and how many endpoints each one offers you.

ParameterTypeRequiredDescription
lang"tr" | "en"NoLanguage of module titles and summaries; default tr.

describe_api_endpoint

All modulesRead

Shows an endpoint's parameters, body schema, response type, whether it needs an SMS code, and a ready-made example call.

ParameterTypeRequiredDescription
idstringYesEndpoint id as find_api_endpoints returns it (METHOD /path), placeholders included.
lang"tr" | "en"NoLanguage of module titles and summaries; default tr.

call_api_read

All modulesRead

Runs read endpoints only and returns the data. The request is marked read-only, so Teamso refuses anything that would change data. Large lists are shortened; files (PDF, Excel, CSV, images) come back embedded, up to 8 MB.

ParameterTypeRequiredDescription
idstringNoId of the endpoint to read (METHOD /path); or give method and path.
method"GET" | "POST" | "PUT" | "PATCH" | "DELETE"NoWith path, instead of id.
pathstringNoCatalog path pattern (with placeholders), with method, instead of id.
path_paramsobjectNoValues for the placeholders in the path, e.g. id.
queryobjectNoQuery parameters; an array repeats the parameter.
bodyobjectNoOnly for reads sent as POST: the filter body.
lang"tr" | "en"NoLanguage of module titles and summaries; default tr.

call_api_write

All modulesDestructive

Creates, changes or deletes records. Without confirm it sends nothing and returns a preview of the request with a schema check; it runs with confirm=true only after you agree. Takes otp_code for actions that need an SMS code and uploads files as base64 (10 MB in total).

ParameterTypeRequiredDescription
idstringYesId of the endpoint to run (METHOD /path).
path_paramsobjectNoValues for the placeholders in the path.
queryobjectNoQuery parameters.
bodyobjectNoJSON matching the endpoint's body schema; for multipart endpoints, the form fields other than files.
files{ field, filename, content_type, base64 }[]NoFiles for multipart endpoints: field name, file name, MIME type and base64 content (at most 10 files, 10 MB in total).
confirmbooleanNofalse (default): preview only, nothing is sent. true: runs it, only after the user explicitly confirmed the preview.
otp_codestringNoFor endpoints that need an SMS code: the code from request_sms_code (valid for 3 minutes).
lang"tr" | "en"NoLanguage of module titles and summaries; default tr.

request_sms_code

All modulesWrite

After you confirm an action that needs an SMS code, sends a 6-digit verification code to your phone (valid for 3 minutes, uses SMS credit).

Takes no parameters.

Troubleshooting

401 Unauthorized
The token is wrong, expired or revoked. Create a new one on the MCP access page; the header must read Bearer tms_pat_....
403 ACCESS_DENIED
You lack the permission, or the operation is not available with a token (password, security settings, token and integration key management).
403 IP_NOT_ALLOWED
Your company's IP restriction rejected the request. With the local package, your machine's IP address must be allowed.
CREDIT_INSUFFICIENT
Creating and cancelling leave uses SMS and digital credit; ask your company admin to top up credits.
OTP_NOT_DONE
The SMS code was not verified or its 3 minutes ran out. Ask for a new code with request_leave_otp.
429 Too Many Requests
The hosted server limits requests per token per minute; wait for the Retry-After seconds given in the response, then retry.
Endpoint not found
If find_api_endpoints cannot find an action, or describe_api_endpoint says "not found", the token owner lacks the permission for it or the endpoint is closed to MCP (login, tokens, passwords). Ask your company administrator for the permission; a new permission applies right away.
Tools do not show up
Fully restart the client; with the local package make sure you run Node.js 20+ and a pinned version.

FAQ

Which data can I reach?

The data you can see in Teamso. The token uses your permissions; unless you are a manager you cannot approve others' leave, and you only see your own payslips.

Is my token stored?

The hosted server neither stores nor logs the token; it forwards the request and forgets it. Teamso keeps only a hash of the token.

Does it use digital credit?

Only operations that need SMS confirmation do, and they cost the same as in the web app: creating a leave request uses 1 digital credit for each person it is created for; cancelling a leave request uses 2 digital credits (one for the deletion, one for timestamping the cancellation document). Read tools and help tools use none.

Can I self-host it?

Yes. Run the open-source npm package locally or on your own server; see the Self-hosted MCP guide. Self-hosted MCP

How do I revoke a token?

With Revoke on the token's row on the MCP access page; requests with that token are rejected immediately.