tsheets-mcp
tsheets-mcp
TSheets (QuickBooks Time) 用のMCPサーバー — Intuitのタイムトラッキング、スケジューリング、PTOプラットフォーム。TSheets REST API v1の全公開エンドポイントをMCPツールとして公開します。
概要
ステートレスなHTTPサービス。認証情報は一切永続化されません — 各リクエストが独自のアクセストークンをヘッダーで提供し、その単一リクエストの期間のみ使用されます。
同時リクエストをサポート。リクエストごとの認証情報の分離は、グローバル/共有クライアントインスタンスではなく、Pythonの
contextvarsを使用して行われます。エントリポイント:
POST /mcp(MCPプロトコル) とGET /health(ヘルスチェック)。デフォルトポート:
8080(MCP_HTTP_PORTで設定可能)。TSheets APIにはパステンプレートパラメータは存在しません — すべての識別子 (
ids、user_idなど) は、単一リソースの参照であってもクエリ文字列パラメータとして渡されます。これは実際のAPI設計上の特徴であり、このサーバーによる簡略化ではありません。
Related MCP server: Timesheet MCP Server
スコープ
15ツール。元の85ツールのフルAPIビルド (2026-08-04) から削減。このベンダーに対するMSPbots自身の保存済み統合設定は、正確に6エンドポイント (Effective Settings、Jobcodes、Users、Customfielditem User Filters、Timesheets、Custom Fields — すべてGET、読み取り専用) を呼び出します。「実際の使用状況 + 同カテゴリのコアCRUD」のスコープ決定に従い、このビルドは正確にその6カテゴリを完全な形で保持します — effective_settings (1、読み取り専用、このリソースにはCRUD動詞は存在しません)、custom_field_item_user_filters (1、同様)、jobcodes (3: 作成/取得/更新)、users (3: 作成/取得/更新)、timesheets (4: 作成/取得/更新/削除)、custom_fields (3: 作成/取得/更新) — 合計15ツール。元の85ツールビルドの他のすべてのカテゴリ (Reports、Files、Time Off Requests (+ Entries)、Schedule Events (+ Calendars)、Reminders、Projects (+ Notes/Activities/Activity Replies/Activity Read Times)、Notifications、Locations (+ Maps)、Jobcode Assignments、Groups、Estimates (+ Items)、Custom Field Items (+ Filters + Jobcode Filters)、Geolocations、Timesheets Deleted、Managed Clients、Last Modified、Invitations、Geofence Configs、Current User — 28カテゴリ、約70ツール) は、MSPbotsが使用していないため完全に削除されました。
保持されたツールのソースデータは、元々TSheetsドキュメントのGitHubリポジトリ (https://github.com/tsheetsteam/api_docs) をクローンし、各エンドポイントのMarkdown/ERBパーシャルファイル (source/includes/APIReference/<Category>/_*.md.erb) を解析して、HTTPメソッド、パス、パラメータテーブルを抽出することで取得されました — これはこのプログラムの他の大規模APIベンダー (ConnectSecure、Dynu、Jira Data Center、Opsgenie) で使用されているものと同じ構造化抽出→コード生成アプローチです。削除されたカテゴリが後で必要になった場合、同じソースを同じ方法で再解析できます。
認証
TSheetsは、ベンダー自身のOAuth/APIアプリフローを介して取得される静的アクセストークンを使用します (MSPbotsの内部KB記事を参照。統合設定からリンクされています)。MSPbots自身の統合規約では、このトークンをAuthorization: Bearer <accessToken>として送信します。これはTSheets自身の文書化された形式と一致し、このサーバーはそのまま転送します。
ヘッダー 認証パラメータ説明
Header | 型 | 必須 | デフォルト値 | 列挙値 | フィールド説明 | 例 |
| string | はい | なし | なし | TSheetsアクセストークン。そのままアップストリームの |
|
ヘッダーがない場合は401を返します:
{
"error": "Missing credentials",
"message": "This server requires the X-TSheets-Access-Token header",
"required_headers": ["X-TSheets-Access-Token"],
"optional_headers": []
}環境変数
Variable | 型 | 必須 | デフォルト値 | 説明 |
| int | いいえ |
| HTTPリスニングポート |
| string | いいえ |
| HTTPリスニングアドレス |
| string | いいえ |
| TSheets APIベースURL |
MCPエンドポイント
POST /mcp— MCPプロトコル (ストリーミング可能なHTTPトランスポート)GET /health— ヘルスチェック。正確に{"status": "ok"}を返します。これは純粋なローカルプローブです — TSheets APIを呼び出さないため、TSheetsの障害でコンテナが不健全とマークされることはありません。
エラーとページネーション
ツールエラーは、インバンドJSONエンベロープとして返されます (例外やプロトコルレベルのエラーではありません):
{"error": {"code": "...", "message": "...", "retryable": true|false}}。codeはnot_configured/unauthorized/not_found/invalid_argument/rate_limited/upstream_errorのいずれかで、アップストリームのHTTPステータスからマッピングされます。TSheets APIへの送信呼び出しは、5秒の接続 / 30秒の読み取りタイムアウトを使用し、
429/5xxでは上限付き指数バックオフで最大3回再試行し (Retry-Afterを尊重)、プロセス存続期間中単一の接続プールを再利用します。すべての
retrieve_*ツールのlimitパラメータはデフォルトで50で、呼び出し元がそれ以上を要求した場合、TSheets自身の文書化されたページあたりの最大値200にクランプされます (TSheets自身のAPIもデフォルト/最大が200なので、両方の上限はここで一致します)。
ツール一覧
ツール名はtsheets_<category>_<operation>で、ソースドキュメントの各操作の## Headingから派生しています (例: timesheetsカテゴリの「Retrieve Timesheets」→ tsheets_timesheets_retrieve_timesheets)。いくつかのretrieveフィルタパラメータは「(X、Y、またはZが設定されていない限り) 必須」と文書化されています — これは単一の必須Pythonパラメータとしてきれいに表現できないN個中の1個の要件であるため、これらはオプションとしてモデル化され、OR制約はツール自身のdocstringに明記されています。create/updateエンドポイントのbodyパラメータは汎用のdictとして受け入れられます — TSheets自身の規約では、これらを{"data": [ {...}, ... ]} (1回の呼び出しで最大50オブジェクトの一括作成/更新) でラップし、ツールごとに文書化されています。
カテゴリ | ツール | 機能 | メソッド+パス | パラメータ |
custom_field_item_user_filters |
| ユーザーフィルターを取得します。 | GET /customfielditem_user_filters | user_id(任意), group_id(任意), include_user_group(任意), modified_before(任意), modified_since(任意), limit(任意), page(任意) |
custom_fields |
| カスタムフィールドを作成します。 | POST /customfields | body(必須) |
custom_fields |
| カスタムフィールドを取得します。 | GET /customfields | ids(任意), active(任意), applies_to(任意), value_type(任意), modified_before(任意), modified_since(任意), supplemental_data(任意), limit(任意), page(任意) |
custom_fields |
| カスタムフィールドを更新します。 | PUT /customfields | body(必須) |
effective_settings |
| 有効な設定を取得します。 | GET /effective_settings | user_id(任意), modified_before(任意), modified_since(任意) |
jobcodes |
| ジョブコードを作成します。 | POST /jobcodes | body(必須) |
jobcodes |
| ジョブコードを取得します。 | GET /jobcodes | ids(任意), parent_ids(任意), name(任意), type(任意), active(任意), customfields(任意), modified_before(任意), modified_since(任意), supplemental_data(任意), limit(任意), page(任意) |
jobcodes |
| ジョブコードを更新します。 | PUT /jobcodes | body(必須) |
timesheets |
| タイムシートを作成します。 | POST /timesheets | body(必須) |
timesheets |
| タイムシートを削除します。 | DELETE /timesheets | ids(任意) |
timesheets |
| タイムシートを取得します。 | GET /timesheets | ids(任意), start_date(任意), end_date(任意), jobcode_ids(任意), payroll_ids(任意), user_ids(任意), group_ids(任意), on_the_clock(任意), jobcode_type(任意), modified_before(任意), modified_since(任意), supplemental_data(任意), limit(任意), page(任意) |
timesheets |
| タイムシートを更新します。 | PUT /timesheets | body(必須) |
users |
| ユーザーを作成します。 | POST /users | body(必須) |
users |
| ユーザーを取得します。 | GET /users | ids(任意), not_ids(任意), employee_numbers(任意), usernames(任意), group_ids(任意), not_group_ids(任意), payroll_ids(任意), active(任意), first_name(任意), last_name(任意), modified_before(任意), modified_since(任意), supplemental_data(任意), limit(任意), page(任意) |
users |
| ユーザーを更新します。 | PUT /users | body(必須) |
テスト例
# Health check
curl -s http://localhost:8080/health
# Call a tool via the MCP protocol (streamable HTTP) — requires an
# initialize handshake first per the MCP spec; abbreviated example below
# shows the tool-call request body only:
curl -s -X POST http://localhost:8080/mcp \
-H "X-TSheets-Access-Token: <your-tsheets-access-token>" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "mcp-session-id: <session-id-from-initialize>" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "tsheets_jobcodes_retrieve_jobcodes",
"arguments": {}
}
}'ライブ検証済み (2026-07-30): 最初のテスト用アクセストークンは期限切れであることが判明しました(401 invalid_grant、直接のcurlでも同一であることを確認 — その実行で何が検出されたかについては下記のバグメモを参照)。その後、新たに発行されたアクセストークンがこの実行中サーバーを通じてエンドツーエンドでテストされ、実際のアカウントデータが返されました:tsheets_current_user_retrieve_the_current_user は実際の現在のユーザーレコード(名前、権限、PTO残高)と補足のジョブコードデータを返し、tsheets_jobcodes_retrieve_jobcodes(MSPbots自身が設定した6つのエンドポイントの1つに一致)は実際のジョブコードレコードを返しました。どちらも、リクエスト/認証/レスポンスのパイプライン全体がライブAPIに対して正しく機能することを確認しています。
セルフテスト中に修正されたバグ: 初期の_raise_for_statusエラーパーサーは、TSheetsが常にエラー詳細を{"error": {"message": "..."}}としてネストすると想定していましたが、TSheetsは実際には認証失敗時にOAuthスタイルのフラットな{"error": "invalid_grant", "error_description": "..."}を返します — 文字列"invalid_grant"に対して.get()を呼び出すと、'str' object has no attribute 'get'でクラッシュしました。これは、このサーバーが完成と見なされる前に、最初の(期限切れの)テストトークンを使用して検出・修正されました。
APIリファレンス
ソース(公式Postmanコレクションを含む): https://github.com/tsheetsteam/api_docs
既知のギャップ
2026-08-04に85ツールから15ツールに削減。 当初のビルドは、以前のスコープ決定に基づき、34カテゴリにわたる完全な公開APIをカバーしていました。その後のスコープ決定により、MSPbotsが実際に使用している6カテゴリのみに削減されました(すべて完全に保持 — 各カテゴリが数ツールを超えなかったため、カテゴリごとの削減は不要でした)— 削除された28カテゴリ(約70ツール)の完全なリストについては、上記のスコープセクションを参照してください。削除されたカテゴリが後で必要になった場合、ソースドキュメント(
https://github.com/tsheetsteam/api_docs)を、保持されたツールが生成されたのと同じ方法で再解析できます。tsheets_timesheets_delete_timesheetsは、ベンダーの公式ドキュメントによるとタイムシートレコードを完全に削除します — 破壊的/不可逆的として扱い、呼び出す前に人間による確認を行ってください。他の保持されているcreate/updateツールも、実際のTSheetsデータ(ジョブコード、ユーザー、カスタムフィールド)を変更します。N個中1つの「必須」フィルターグループはすべて任意としてモデル化 — いくつかの
Retrieveエンドポイントは、パラメータを「(X、Y、またはZが設定されていない限り)必須」と文書化しています。これを実際の制約として強制することは、単純な関数シグネチャでは表現できないため、そのようなパラメータはすべてツールシグネチャでは任意となり、OR要件は代わりにdocstringに明記されています。呼び出し元は、文書化された制約に従って少なくとも1つを提供する必要があります。そうしないと、ライブAPIがリクエストを拒否します。bodyパラメータは完全にモデル化されておらず、型なし(dict)です — TSheetsの公式ドキュメントにはタイプごとのフィールドバリアントが示されています(例:「通常のタイムシート」と「手動タイムシート」では、同じdata配列内で必須フィールドが異なります)。これらは固定の型付きパラメータにきれいにマッピングできません。ベンダーの公式リファレンス(上記リンク)に、リソースごとの正確なスキーマが文書化されています。
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
No tool schema history has been recorded yet.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Read time entries, projects, clients, tasks and invoices; log and update tracked time.
Read and write Mission Control state via MCP — projects, tasks, subtasks, templates, status updates.
- mcp-serverOAuthio.klokin
MCP server exposing klokin time-tracking operations (employees, time entries, stores) to AI clients.
- OneOAuthai.withone
Search, document and execute authenticated API calls across 700+ apps via one MCP server
Related MCP Servers
- -licenseNot gradedqualityNot gradedmaintenanceProvides MCP integration for Harvest's time tracking, project management, and invoicing functionality, enabling natural language interaction with Harvest API through tools for managing clients, time entries, projects, tasks, and users.-

Timesheet MCP Serverofficial
AlicenseBqualityBmaintenanceEnables natural language control of the Timesheet API for timer management, task tracking, and project management through MCP tools.50741MIT- AlicenseCqualityCmaintenanceEnables interacting with Clockify time-tracking data through natural language, providing tools to manage workspaces, projects, time entries, reports, and more via the MCP protocol.481MIT
- AlicenseNot gradedqualityBmaintenanceEnables natural language time tracking and booking for WorkTracker via MCP tools, allowing users to assign time, list projects, and manage daily schedules through conversational commands.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/MSPbotsAI/tsheets-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server