Skip to main content
Glama
nori1173-ops

SaaS_A MCP Server

by nori1173-ops

SaaS_A MCP Server

SaaS_A(弊社のIoT観測データ監視SaaS)の管理用REST API の参照専用 MCP サーバーです。

テナント、ユーザー、現場(グループ)、地点(端末)、フォーマット(機種)の構成情報と、 受信データ履歴の CSV エクスポートを Claude Code / Cursor / Claude Desktop から直接調査できます。 すべてのツールは GET リクエストのみを使用しており、登録・更新・削除などの書き込み操作は一切できない安全設計です。


ステータス: 実装済み(2026-08-20)

項目

状況

設計書

完了 → Documents/DESIGN.md

引き継ぎ資料

完了 → Documents/HANDOVER.md

src/ の実装(9ツール・認証層・整形・CSVエクスポート)

完了

tests/(ユニット134件・検証環境への統合テスト15件)

完了・全パス

社内Gitサーバーへの登録

完了(http://192.0.2.10/git/saas-a-mcp

MCP専用APIユーザーの発行

未発行(検証用ユーザーを共用中。HANDOVER.md 未決事項 #1)

本番環境対応

待ち(本番はBearer認証未対応。リリース時期未確定)

経緯・設計判断は Documents/DESIGN.md、残る未決事項は Documents/HANDOVER.md の4章を参照してください。


Related MCP server: lcm2m-caddis-mcp

前提条件

  • uv がインストール済みであること

  • SaaS_A の API 専用ユーザーuser_cd / パスワード)が発行済みであること

  • 現時点で接続できるのは検証環境のみです(本番環境は旧実装のため Bearer 認証に未対応)

uv のインストール

OS

インストール方法

Windows

`powershell -c "irm https://astral.sh/uv/install.ps1

WSL / Linux

`curl -LsSf https://astral.sh/uv/install.sh

注意: Windows では winget install astral-sh.uv ではなく公式スクリプトを使用してください。winget 版は PATH の反映に問題が生じることがあります。

インストール

uv が Python と依存パッケージを自動管理するため、手動インストールは不要です。

依存パッケージ:

パッケージ

バージョン

用途

mcp

>= 1.26.0, < 2

MCP SDK (FastMCP)

httpx

>= 0.27.0

HTTP クライアント

設定方法

環境変数

環境変数

必須

説明

SAAS_A_BASE_URL

API のベース URL(末尾スラッシュなし)

https://verify.example-iot.net

SAAS_A_USER

API 専用ユーザーの user_cd

SAAS_A_PASS

API 専用ユーザーのパスワード

既定値はありません。 認証情報を含むため、3 つすべてを MCP 設定の env セクションで指定する必要があります。 キー名のテンプレートは .env.example を参照してください。

重要: API 専用ユーザーを使ってください。 SaaS_A は 1 ユーザーにつき有効なアクセストークンを 1 つしか保持しません。 同じユーザーで別のシステムや別の担当者が認証すると、互いのトークンを失効させ合い、どちらも安定して動作しません。 このサーバー専用のユーザーを発行して使用してください。詳細は DESIGN.md の 6.4 節 を参照。

Claude Code(WSL)での設定

社内 Git サーバーから直接取得します。.claude.jsonmcpServers に追加:

{
  "mcpServers": {
    "saas-a": {
      "command": "uvx",
      "args": [
        "--from",
        "git+http://192.0.2.10/git/saas-a-mcp@develope",
        "saas-a-server"
      ],
      "env": {
        "SAAS_A_BASE_URL": "https://verify.example-iot.net",
        "SAAS_A_USER": "<APIユーザーのuser_cd>",
        "SAAS_A_PASS": "<APIユーザーのパスワード>"
      }
    }
  }
}

claude mcp add コマンドでも設定できます:

claude mcp add saas-a \
  -s user \
  -e SAAS_A_BASE_URL=https://verify.example-iot.net \
  -e SAAS_A_USER=<APIユーザーのuser_cd> \
  -e SAAS_A_PASS=<APIユーザーのパスワード> \
  -- uvx --from "git+http://192.0.2.10/git/saas-a-mcp@develope" saas-a-server

Cursor での設定

~/.cursor/mcp.json(グローバル)またはプロジェクトルートの .cursor/mcp.json に追加:

{
  "mcpServers": {
    "saas-a": {
      "command": "uvx",
      "args": [
        "--from",
        "git+http://192.0.2.10/git/saas-a-mcp@develope",
        "saas-a-server"
      ],
      "env": {
        "SAAS_A_BASE_URL": "https://verify.example-iot.net",
        "SAAS_A_USER": "<APIユーザーのuser_cd>",
        "SAAS_A_PASS": "<APIユーザーのパスワード>"
      }
    }
  }
}

Cursor は MSIX アプリではないため、Git URL 方式が直接動作します。

Claude Desktop / Cowork(Windows)での設定

Windows では MSIX アプリの制約により uvx の Git URL 方式が動作しないため、事前にツールをインストールします。

初回セットアップ(PowerShell で一度だけ実行):

uv tool install "git+http://192.0.2.10/git/saas-a-mcp@develope"

MCP 設定claude_desktop_config.json に追加):

{
  "mcpServers": {
    "saas-a": {
      "command": "saas-a-server",
      "env": {
        "SAAS_A_BASE_URL": "https://verify.example-iot.net",
        "SAAS_A_USER": "<APIユーザーのuser_cd>",
        "SAAS_A_PASS": "<APIユーザーのパスワード>"
      }
    }
  }
}

更新時:

uv tool upgrade saas-a-mcp

開発者向け(ローカルパス方式)

リポジトリをクローンして開発中の場合は、ローカルパスを指定することもできます:

{
  "command": "uvx",
  "args": ["--from", "/path/to/saas-a-mcp", "saas-a-server"]
}

注意: この方式はパスに依存するため、フォルダを移動すると動作しなくなります。

ツール一覧(9 ツール・すべて参照専用)

権限レベルは、その操作を実行するために API 専用ユーザーに必要なユーザーレベルです。 (1: システム管理者、2: テナント管理者、3: 現場管理者、4: ユーザー管理者、5: 一般ユーザー)

テナント系(2 ツール)

ツール名

必要権限

説明

list_tenants

制限なし

テナント一覧を取得。他のツールに渡す tenant_id はここで取得します(最初に呼ぶツール)

list_tenant_dashboards

1, 2

テナント用ダッシュボード一覧を取得

ユーザー系(1 ツール)

ツール名

必要権限

説明

list_users

制限なし

指定テナントのユーザー一覧を取得(ユーザーCD・名称・権限レベル・タイムゾーン)

現場系(2 ツール)

ツール名

必要権限

説明

list_groups

制限なし

現場(グループ)一覧を取得。所属ユーザー・通知先は既定で件数のみ(include_members / include_destinations で全量取得)

list_group_dashboards

1, 2, 3

現場用ダッシュボード一覧を取得

地点系(2 ツール)

ツール名

必要権限

説明

list_devices

制限なし

地点(端末)一覧を取得。現場CDで絞り込み可。フォーマット詳細・通知先は既定で件数のみ(include_format_detail / include_alerts で全量取得)

list_device_dashboards

1, 2

地点用ダッシュボード一覧を取得

フォーマット系(1 ツール)

ツール名

必要権限

説明

list_formats

1 のみ

フォーマット(機種)一覧を取得。システム管理者権限が必要です

エクスポート系(1 ツール)

ツール名

必要権限

説明

export_observation_data

1, 2, 3

受信データ履歴を CSV でエクスポート。期間・現場・地点を指定。既定では要約を返し、save_path 指定でファイル保存

操作例

Claude Code や Cursor で自然言語で指示するだけで、適切なツールが呼び出されます。

例 1: テナント一覧から調査を始める

SaaS_A のテナントを一覧して

list_tenants() が呼ばれます。以降のツールに必要な tenant_id はここで確認できます。

例 2: 現場ごとの地点数を調べる

運用テストテナントの現場ごとの地点数を教えて

list_tenants()list_groups(tenant_id=...) の順で呼ばれ、各現場の device_count が返ります。

例 3: 特定現場の地点を絞り込む

テナントXの現場CD group001 に属する地点を一覧して

list_devices(tenant_id=..., group_cds=["group001"]) が呼ばれます。

例 4: 観測データをCSVで取得する

テナントXの全地点の 2026-08-01 〜 2026-08-07 の観測データを生値でCSVに出して

export_observation_data(tenant_id=..., start_date="2026-08-01", end_date="2026-08-07", group_cd="all", device_cd="all", output_type="raw_data") が呼ばれます。 CSV 本文はコンテキストを圧迫するため、既定では行数・カラム・先頭 20 行のプレビューとファイル保存先が返ります。

トラブルシューティング

エラー

原因

対処法

401 Unauthorized が繰り返される

同じ API ユーザーが他のシステム・他の担当者に使われている(1ユーザー1トークン制約)

このサーバー専用の API ユーザーを発行して使用してください

401 Authentication failed(初回認証時)

SAAS_A_USER / SAAS_A_PASS が誤っている

環境変数の値を確認してください

403 ForbiddenCommon.forbidden

API ユーザーの権限レベル不足、またはテナント参照権限なし

ツール一覧の「必要権限」を確認してください。list_formats はシステム管理者専用です

400 Error.Common.LimitOver

エクスポート件数が上限を超過

start_date / end_date の期間を短くするか、group_cd / device_cd で対象を絞ってください

Error.Common.NoRecords

指定条件に該当するデータが 0 件(エラーではありません)

期間・現場CD・地点CDを見直してください

接続できない / タイムアウト

接続先 URL の誤り、またはネットワーク

SAAS_A_BASE_URL を確認してください。本番 URL(saas-a.example.jp)は現時点では使用できません

uvx が見つからない

uv 未インストール

前提条件のインストール手順を参照してください

キャッシュが古い

uvx のキャッシュ

uv cache prune を実行してから再起動してください

Git operation failed(Claude Desktop / Cowork)

MSIX アプリの git 制約

uv tool install 方式を使用してください(Windows 設定手順を参照)

制限事項

  • 参照のみ: すべてのツールは GET リクエストのみです。テナント・ユーザー・現場・地点の登録/更新/削除、通知先の追加・変更はできません

  • 検証環境のみ: 最終仕様の API が稼働しているのは検証環境(verify.example-iot.net)だけです。本番環境(saas-a.example.jp)は旧実装のため Bearer 認証に未対応で、リリース時期は未確定です

  • API 専用ユーザーが必要: 1 ユーザー 1 トークンの制約により、他用途との共用はできません

  • 子現場の詳細は取得不可: list_groups が返す children は「子現場の有無」を示すだけで、子現場自体の情報を取得する API は提供されていません

  • 受入検証中の API: 対象 API は社内Redmine の受入検証チケットで受入検証中であり、仕様が変更される可能性があります

  • エクスポートCSVは UTF-8 で保存: API の元データは cp932 ですが、保存時に UTF-8 へ変換します。Excel で開くときは「データ」→「テキストまたは CSV から」で文字コードに UTF-8 を指定してください(そのまま開くと文字化けします)

  • 一時ディレクトリのCSVは自動削除されません: save_path を省略すると OS の一時ディレクトリに保存されます。不要になったファイルは手動で削除してください

ドキュメント

ドキュメント

内容

Documents/DESIGN.md

設計書。スコープ、技術選定、ツール設計、認証・トークン管理、エラー処理、セキュリティ

Documents/HANDOVER.md

引き継ぎ資料。前提知識、実装手順、テスト方針、未決事項

参照実装

本サーバーは社内の既存 MCP サーバー mail-backend-mcphttp://192.0.2.10/git/mail-backend-mcp)と 同一の構成・配布形式で実装します。実装時はそちらのコードを写経ベースにしてください。

ライセンス

社内利用限定

Available Tools

9 tools
export_observation_dataA

受信データ履歴を CSV でエクスポートします。

tenant_id は list_tenants で、group_cd は list_groups で、device_cd は list_devices で 取得してください。全件を対象にする場合は group_cd / device_cd に all を指定します。

必要な権限レベル: システム管理者(user_level=1)、テナント管理者(user_level=2)、 現場管理者(user_level=3)。権限が不足すると 403 になります。

CSV 本文はそのまま返しません(コンテキストを使い切るため)。 既定では行数・カラム名・先頭20行のプレビュー・データ期間の要約を返し、 CSV 本体は UTF-8 のファイルとして保存してその絶対パスを返します。 save_path を指定するとそのパス(絶対パスのみ・ディレクトリ可)へ、 未指定なら一時ディレクトリへ保存します。既存ファイルは上書きせず別名で保存します。 分析にはこのファイルを使ってください。

取得件数が API の上限を超えると 400 になります。その場合は期間を短くするか、 device_cd を all から個別の地点に絞って再実行してください。

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoレスポンスの言語(ja / en)ja
end_dateYes終了日(YYYY-MM-DD)。未来日は API 側で現在時刻に丸められる
group_cdYes現場CD。全現場を対象にする場合は all
device_cdYes地点CD。全地点を対象にする場合は all
save_pathNoCSVの保存先の絶対パス(ファイル名またはディレクトリ)。相対パスはエラー。未指定なら一時ディレクトリに保存してパスを返す
tenant_idYesテナントID(UUID)。list_tenants で取得できる
start_dateYes開始日(YYYY-MM-DD)
output_typeYes表示項目形式(raw_data=生値、formatted_data=整形データ)

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Richly discloses behavior beyond annotations: the CSV body is intentionally not returned, a preview with row count/column names/first 20 rows is returned, the file is saved to a temp directory unless save_path is set, existing files are not overwritten, and insufficient permissions cause a 403. This gives the agent a clear mental model of side effects and failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then organized into lookup guidance, permissions, output behavior, and error handling. Every sentence carries actionable information; nothing is redundant or filler despite the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter tool with no output schema and minimal annotations, the description covers the essentials: what is returned, how files are saved, permission requirements, ID sourcing, and error recovery. An agent can invoke this tool and interpret its result correctly without external context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds value by telling the agent where to source group_cd and device_cd (list_groups/list_devices), which the schema does not, and by explaining save_path overwrite behavior. The 'all' special value and absolute-path rule are already in the schema, so the added value is meaningful but not extensive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb and resource: export received data history as CSV. It also clarifies the actual deliverable (a saved UTF-8 file and absolute path, not the CSV body), which immediately distinguishes it from the sibling list_* tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides strong usage context: tells the agent to obtain tenant_id/group_cd/device_cd from specific list_* tools, explains the 'all' option for full datasets, and gives recovery guidance when the API limit returns 400. It does not explicitly frame when not to use this tool, but no sibling is a true alternative for export, so this is a minor gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_device_dashboardsA
Read-only

地点用ダッシュボードの一覧を取得します。

tenant_id は list_tenants で取得してください。

必要な権限レベル: システム管理者(user_level=1)、テナント管理者(user_level=2)。 権限が不足すると 403 になります。

このエンドポイントはページングに対応していないため、常に全件を返します (エンベロープの page / per_page は null)。

ParametersJSON Schema
NameRequiredDescriptionDefault
tenant_idYesテナントID(UUID)。list_tenants で取得できる

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=true, destructiveHint=false), the description discloses important behaviors: required permission levels, 403 on insufficient rights, no paging, always returning all items, and that envelope page/per_page will be null. This is substantive behavioral information that annotations alone do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is organized with a leading purpose sentence, followed by prerequisite, authorization, and pagination behavior. Each sentence adds distinct, necessary information and there is no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only listing tool, the description covers how to obtain the required parameter, required permissions, the error case, and pagination semantics. This is sufficient for an agent to invoke the tool correctly without an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes tenant_id as a UUID obtainable via list_tenants, and the description largely repeats this. With 100% schema description coverage, the baseline of 3 applies; the description adds permission context but not new parameter semantic details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: '地点用ダッシュボードの一覧を取得します' (retrieves the list of site/location dashboards). The resource is clear from the name and description, but it does not explicitly contrast with sibling tools such as list_tenant_dashboards or list_group_dashboards, so sibling differentiation rests mostly on the tool name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: tenant_id should be obtained via list_tenants, required permission levels are described, and the 403 failure case is specified. It does not explicitly mention when to prefer this tool over alternatives, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_devicesA
Read-only

テナントに紐づく地点(端末)の一覧を取得します。

Web管理画面の地点編集一覧と同じ情報(登録・更新項目の現在値)が得られます。 tenant_id は list_tenants で取得してください。

必要な権限レベル: 制限なし(どのユーザーレベルでも実行できます)。

既定で間引く項目:

  • format_detail(項目定義。1フォーマットあたり数百件)→ format_detail_count のみ。 全量は include_format_detail=true

  • address(通知先。メールアドレスを含む)→ alert_count のみ。全量は include_alerts=true

periodic_collection は、項目追加前に作成された既存地点では null になることがあります。 欠損と「停止(stop)」を取り違えないよう、null はそのまま返します。

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoページ番号(1始まり)。0 を指定すると全件取得になるが、件数が多いと応答が非常に大きくなるため通常は指定しない
per_pageNo1ページあたりの件数(1〜999)
group_cdsNo現場CDによる絞り込み。複数指定時は OR 条件。list_groups で取得できる
tenant_idYesテナントID(UUID)。list_tenants で取得できる
include_alertsNo地点の通知先(address)の全量を含める。メールアドレスを含む
include_format_detailNoフォーマット項目定義(format_detail)の全量を含める。1地点あたり数百件になりうる

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=true, destructiveHint=false), the description adds critical behavioral detail: default thinning of format_detail and address fields, the specific effect of include flags, and the quirk that periodic_collection may be null for legacy devices and is returned as null rather than conflated with 'stop'. This is exactly the kind of non-obvious runtime behavior an agent needs to interpret results correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately long but every sentence earns its place: purpose, permission, thinning defaults, flags, and a null-handling caveat are all packed into a clear structure with dash-prefixed bullets. The most important purpose statement is front-loaded, and there is no redundant or filler text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 6 parameters, no output schema, and annotations that already cover safety, the description covers the essential behavior: data source equivalence, prerequisites, permission, filtering, thinned fields, and null semantics. Minor gaps include lack of explicit mention of pagination behavior or response structure, but the 'same info as web admin edit list' reference partially compensates for the missing output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameters are already documented. The description adds meaningful semantics by explaining the practical consequences of include_format_detail (hundreds of items per format) and include_alerts (includes email addresses), and by clarifying that group_cds supports OR filtering. It does not discuss page/page_size, but those are straightforward and already covered by the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'テナントに紐づく地点(端末)の一覧を取得します' (retrieves the list of locations/devices linked to a tenant). It also distinguishes itself by stating it returns the same information as the web admin location edit list, and it references sibling tools list_tenants and list_groups for prerequisite IDs, clearly separating it from list_users, list_formats, and dashboard tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent to obtain tenant_id via list_tenants, and explains when to enable include_format_detail and include_alerts based on data volume needs. It also states permission requirements ('制限なし'), providing clear invocation context. It does not explicitly say 'do not use for dashboards' or name list_device_dashboards as an alternative, though the sibling names make that implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_formatsA
Read-only

テナントのフォーマット(機種)一覧を取得します。

tenant_id は list_tenants で取得してください。

必要な権限レベル: システム管理者(user_level=1) のみ。 テナント管理者以下の API ユーザーでは 403 になります。 403 が返った場合、パラメータではなく API ユーザーの権限レベルを疑ってください。

項目定義そのもの(各フォーマットの項目一覧)は含まれません。項目数は koumoku_count で分かります。 個々の項目定義が必要な場合は list_devices を include_format_detail=true で呼んでください。 間引きは行いません。

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoレスポンスの言語(ja / en)ja
pageNoページ番号(1始まり)。0 を指定すると全件取得になるが、件数が多いと応答が非常に大きくなるため通常は指定しない
per_pageNo1ページあたりの件数(1〜999)
tenant_idYesテナントID(UUID)。list_tenants で取得できる

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/destructive annotations, the description discloses permission requirements, 403 behavior, that item definitions are excluded, that koumoku_count provides item counts, and that no thinning/sampling is performed. This gives the agent a rich behavioral model of the tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise but information-dense. Every sentence adds a distinct fact: purpose, tenant_id source, permissions, response boundaries, and alternative tool routing. The most important facts are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description partially carries the burden of explaining the response. It clarifies what is not returned and mentions koumoku_count, but it does not enumerate the actual response fields. Still, this is nearly complete for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents all parameters with 100% coverage, so the baseline is 3. The description adds value by explaining where to get tenant_id and by clarifying that 403 errors are about API user permissions rather than parameter correctness.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a specific verb and resource: retrieving the list of tenant formats/models. It also explicitly distinguishes itself from list_devices by stating that item definitions are not included, making the purpose clear relative to siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit guidance: obtain tenant_id from list_tenants, requires system administrator level, and 403 should be interpreted as a permission problem rather than a parameter problem. It also names the exact alternative, list_devices with include_format_detail=true, when item definitions are needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_group_dashboardsA
Read-only

現場用ダッシュボードの一覧を取得します。

tenant_id は list_tenants で取得してください。

必要な権限レベル: システム管理者(user_level=1)、テナント管理者(user_level=2)、 現場管理者(user_level=3)。権限が不足すると 403 になります。

このエンドポイントはページングに対応していないため、常に全件を返します (エンベロープの page / per_page は null)。

ParametersJSON Schema
NameRequiredDescriptionDefault
tenant_idYesテナントID(UUID)。list_tenants で取得できる

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full burden and adds valuable behavioral detail: no paging support, always returns all records, page/per_page will be null, and insufficient permissions yield 403. It does not literally say 'read-only' but '取得' strongly implies a safe GET-like operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded and every sentence addresses a distinct concern: tenant acquisition, permissions, and paging. There is minor redundancy with the schema's tenant_id description, but overall the structure is efficient and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter list operation, the description covers prerequisites, permission failure, and pagination behavior. There is no output schema, and the description does not describe response fields; however, enough information is present to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, tenant_id, is already well described in the input schema with type UUID and source via list_tenants. The description repeats this guidance without adding meaningful new semantics, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description opens with '現場用ダッシュボードの一覧を取得します', naming a specific verb and resource. It clearly identifies a read/list operation and is distinguishable from sibling tools like list_formats and export_observation_data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs that tenant_id should be obtained via list_tenants and states the required permission levels with 403 behavior. It gives clear context for valid invocation, though it does not explicitly say when not to use this tool versus an alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_groupsA
Read-only

テナントに紐づく現場(グループ)の一覧を取得します。

tenant_id は list_tenants で取得してください。

必要な権限レベル: 制限なし(どのユーザーレベルでも実行できます)。

既定で間引く項目:

  • member(所属ユーザー。メールアドレスを含む)→ member_count のみ。全量は include_members=true

  • destination(通知先。メールアドレスを含む)→ destination_count のみ。全量は include_destinations=true

  • children → has_children (bool) に置換。API 仕様上つねに空配列で、 子現場の詳細を取得する操作は提供されていないため、階層構造の完全な取得はできません

  • dashboard_id(単数形・未使用項目)→ 返しません。dashboard_ids を参照してください

このエンドポイントはページングに対応していないため、常に全件を返します。 現場の最大階層レベルは max_group_level として返します。

ParametersJSON Schema
NameRequiredDescriptionDefault
langNoレスポンスの言語(ja / en)ja
tenant_idYesテナントID(UUID)。list_tenants で取得できる
include_membersNo現場所属ユーザー(member)の全量を含める。メールアドレスを含む
include_destinationsNo現場の通知先(destination)の全量を含める。メールアドレスを含む

TDQS

A3.8/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description is rich in behavioral caveats: default thinning of email-containing fields, children always empty, dashboard_id omitted, and max_group_level returned. However, it directly contradicts the openWorldHint annotation by claiming the endpoint 'always returns all records' (常に全件を返します), while openWorldHint signals that the result set may not be complete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is organized with purposeful sections: purpose, precondition, permission, default field thinning, and pagination. Every sentence adds operational value and the structured bullets make the behavior easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with no output schema, the description covers the key output transformations, permission requirements, paging behavior, and hierarchy limitations, so an agent can understand what it will receive. It loses some completeness because the exhaustiveness claim conflicts with openWorldHint, but the rest of the call context is well covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is complete, and the description adds meaningful parameter context: include_members and include_destinations control whether full email-containing fields are returned, and tenant_id is sourced from list_tenants. This goes beyond the schema's basic field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the verb ('一覧を取得') and resource ('テナントに紐づく現場/グループ'), so the agent knows exactly what the tool returns. It is distinct from sibling list tools by specifying 'グループ' as the domain object and referring to list_tenants for the id.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives practical usage context: tenant_id comes from list_tenants, no special permission is required, and the endpoint has no pagination. It does not explicitly contrast this tool with siblings such as list_group_dashboards, but the stated context is clear enough for correct selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tenant_dashboardsA
Read-only

テナント用ダッシュボードの一覧を取得します。

tenant_id は list_tenants で取得してください。

必要な権限レベル: システム管理者(user_level=1)、テナント管理者(user_level=2)。 権限が不足すると 403 になります。

このエンドポイントはページングに対応していないため、常に全件を返します (エンベロープの page / per_page は null)。

ParametersJSON Schema
NameRequiredDescriptionDefault
tenant_idYesテナントID(UUID)。list_tenants で取得できる

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds meaningful behavioral context: required permission levels, the 403 error for insufficient permissions, and the fact that pagination is unsupported so all records are always returned with page/per_page null.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the purpose. Each subsequent sentence adds distinct value: parameter sourcing, permissions, error behavior, and pagination behavior. There is no redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only list endpoint, the description covers the essential operational facts: purpose, parameter source, permission requirements, error case, and pagination behavior. It does not describe the shape or fields of returned dashboards, but this is not critical for correctly invoking the tool and no output schema exists to supplement it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema already documents tenant_id as a UUID obtainable from list_tenants. The description repeats this guidance without adding additional parameter semantics, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the specific verb '取得します' (retrieve) and the exact resource 'テナント用ダッシュボードの一覧' (list of tenant dashboards). The resource scope clearly distinguishes it from sibling tools like list_device_dashboards and list_group_dashboards.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context by explaining that tenant_id should be obtained from list_tenants and specifying required permission levels. It does not explicitly compare with sibling tools or state when not to use this tool, so it misses a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tenantsA
Read-only

テナント一覧を取得します。

ほとんどのツールは tenant_id を必須パラメータに持つため、 SaaS_A の調査はまずこのツールで tenant_id を取得することから始めてください。

必要な権限レベル: 制限なし(どのユーザーレベルでも実行できます)。

既定で間引く項目: tenant_logo(ロゴ画像の Data URL。数百KBになりうる)は返さず、 has_logo (bool) で設定の有無のみ返します。画像そのものを取得する手段はありません。

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoページ番号(1始まり)。0 を指定すると全件取得になるが、件数が多いと応答が非常に大きくなるため通常は指定しない
per_pageNo1ページあたりの件数(1〜999)

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description does not need to restate safety. It adds valuable behavioral detail beyond annotations: no permission restrictions, tenant_logo is omitted by default and replaced with has_logo(bool), and image retrieval is impossible. This meaningfully informs an agent about response size and data constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured. It leads with the core purpose, then gives workflow guidance, permission level, and important response-thinning behavior. Every sentence contributes useful information without redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity tool with no required parameters and no output schema, the description covers the essential operational details: purpose, first-use workflow, permission level, and a notable response-field omission. It could be slightly more complete by explicitly listing the returned fields, but the mention of tenant_id and has_logo gives enough guidance for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameters page and per_page are already fully documented. The description adds no additional parameter-level semantics beyond what the schema provides, which matches the baseline score of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function with a specific verb and resource: 'テナント一覧を取得します' (retrieves the list of tenants). It also differentiates the tool from siblings by positioning it as the necessary first step for obtaining tenant_id, which most other tools require, making its role distinct.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: 'SaaS_A の調査はまずこのツールで tenant_id を取得することから始めてください' explicitly tells the agent when to use this tool. It does not explicitly name alternatives or when-not-to-use conditions, but the workflow guidance is strong enough for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_usersA
Read-only

テナントに所属するユーザーの一覧を取得します。

tenant_id は list_tenants で取得してください。

必要な権限レベル: 制限なし(どのユーザーレベルでも実行できます)。

レスポンスにはメールアドレス(mailaddress)が含まれます。 個人情報であるため、必要のない場面で転記しないでください。 間引きは行いません。

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoページ番号(1始まり)。0 を指定すると全件取得になるが、件数が多いと応答が非常に大きくなるため通常は指定しない
per_pageNo1ページあたりの件数(1〜999)
tenant_idYesテナントID(UUID)。list_tenants で取得できる

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint/destructiveHint annotations, the description reveals that the response contains the personal mailaddress, warns against unnecessary transcription, states that no permission level is required, and confirms no thinning/truncation is performed. This is substantive behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: purpose first, then prerequisite, permission, response privacy, and behavioral note. Each sentence contributes distinct information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple paginated list endpoint, the description covers purpose, prerequisites, permissions, and a key response field. Without an output schema, it does not enumerate all user fields beyond mailaddress, which leaves a small gap in expected response shape.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents tenant_id, page, and per_page fully. The description only repeats that tenant_id comes from list_tenants, which the schema already says, so it adds no meaningful parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear action and object: 'テナントに所属するユーザーの一覧を取得します' (get the list of users belonging to a tenant). This distinguishes it from sibling list_tenants/list_groups/list_devices by resource, though it does not explicitly contrast itself with them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives actionable context: tenant_id should be obtained from list_tenants first, and it states there is no permission restriction. It does not explicitly say when not to use this tool or name an alternative for a different resource, but the prerequisite workflow is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A4.3/5.0
Disambiguation5/5

Each tool targets a distinct resource: users, tenants, groups, devices, formats, three dashboard scopes, and observation data export. There is no overlap or ambiguity between any of the nine tools.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern: eight are list_<resource> and the sole exception is export_observation_data, which still uses the same verb_noun structure. No mixed conventions.

Tool Count5/5

Nine tools is well within the ideal 3-15 range. Each tool covers a distinct aspect of the SaaS domain, so none feel redundant or unnecessary.

Completeness4/5

The tool set provides comprehensive read/list operations for all core entities (tenants, users, devices, groups, formats, dashboards) plus a data export function. It lacks single-item detail retrieval and any create/update/delete operations, but this appears to be an intentional read-only server design.

Maintenance

ActivityMaintained
ResponsivenessNo issues

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

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Read-only MCP server that allows AI assistants to query and monitor KVM Fleet devices, audit logs, and console sessions through the official REST API.
    5
    19
    1
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables read-only access to LCM2M Caddis VM2M API for equipment, runs, telemetry, alarms, etc., via MCP tools.
    31
    27
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    A read-only MCP server for Microsoft Intune and Entra ID that enables list, get, search, and reporting operations for tenant visibility, audits, troubleshooting, and health reporting without write actions. It includes authentication helpers, report exports, and metadata discovery tools.
    36
    1
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Read-only MCP server for Microsoft Entra ID (Azure AD) that enables querying user sign-in logs, group memberships, and assigned Microsoft 365 licenses via Microsoft Graph API. Provides security and audit visibility without any write operations.

Latest Blog Posts

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/nori1173-ops/iot-saas-readonly-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server