OneUptime について
OneUptimeのMCPサーバーは、AIエージェントから監視やインシデント対応データを管理できます。運用レコードのCRUD、テレメトリの検索、専用の対応ワークフローを提供します。
主な機能
- 01インシデント、アラート、モニターの管理
- 02運用レコードのCRUD
- 03テレメトリリソースの検索
- 04インシデントの確認と解決
- 05公開ステータスページ用ツール
活用シーン
- 01インシデントのトリアージと解決
- 02ログと例外の調査
- 03顧客向けステータスページの更新
MCP 対応
ステートレスなStreamable HTTPエンドポイントを通じて、MCPクライアントにOneUptimeのデータと操作を公開します。OAuth 2.1ログインまたはリクエストごとのAPIキー認証に対応します。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://oneuptime.com/mcpclaude mcp add --transport http com-oneuptime https://oneuptime.com/mcp{"mcpServers":{"com-oneuptime":{"type":"http","url":"https://oneuptime.com/mcp"}}}Cursor で開く{"servers":{"com-oneuptime":{"type":"http","url":"https://oneuptime.com/mcp"}}}VS Code で開く{"mcpServers":{"com-oneuptime":{"type":"http","url":"https://oneuptime.com/mcp"}}}{"mcpServers":{"com-oneuptime":{"serverUrl":"https://oneuptime.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
https://oneuptime.com/mcp認証が必要ツール
詳細
OneUptime MCP Server
AI エージェントに OneUptime の機能を提供する Model Context Protocol(MCP)サーバーです。MCP 対応クライアント(Claude、Copilot を使用する VS Code、Cursor など)から、約 190 個のツールを通じてインシデント、アラート、モニター、ステータスページ、オンコール、テレメトリーを管理できます。
仕組み
- トランスポート:
/mcpでの Streamable HTTP。サーバーはステートレスです。セッション ID は発行も要求もされないため、ロードバランサーや複数レプリカのデプロイ環境でも安全に利用できます。 - ホスト型エンドポイント:
https://oneuptime.com/mcp - セルフホスト型エンドポイント:
https://<your-host>/mcp(Nginx の背後にある App コンテナによって提供されます) - 認証:OneUptime にサインインする(MCP 認可仕様に準拠した OAuth 2.1)、またはリクエストごとに
x-api-keyヘッダーかAuthorization: Bearer <key>(スキームの大文字と小文字は区別されません)で API キーを指定します。環境変数による API キーはありません。すべてのリクエストに個別の認証情報を指定します。
クライアントの接続
サインインする場合
クライアントには URL だけを指定します。ID が必要なツールを初めて呼び出すと、WWW-Authenticate チャレンジとともに 401 が返されます。クライアントはそこから認可サーバーを検出し、ユーザーのブラウザーで同意画面を開いて、ユーザーが選択したプロジェクトのトークンを取得します。
claude mcp add --transport http oneuptime https://oneuptime.com/mcp
{ "servers": { "oneuptime": { "type": "http", "url": "https://oneuptime.com/mcp" } } }
このセクションの残りでは、常時稼働するエージェント向けに、API キーを使って同じクライアントを設定する方法を説明します。
Claude Desktop
claude_desktop_config.json に追加します。
{
"mcpServers": {
"oneuptime": {
"transport": "streamable-http",
"url": "https://oneuptime.com/mcp",
"headers": {
"x-api-key": "your-api-key-here"
}
}
}
}
Claude Code
claude mcp add --transport http oneuptime https://oneuptime.com/mcp \
--header "x-api-key: your-api-key-here"
VS Code(GitHub Copilot)
.vscode/mcp.json またはユーザーの MCP 設定:
{
"servers": {
"oneuptime": {
"type": "http",
"url": "https://oneuptime.com/mcp",
"headers": {
"x-api-key": "${input:oneuptime-api-key}"
}
}
},
"inputs": [
{
"type": "promptString",
"id": "oneuptime-api-key",
"description": "OneUptime API Key",
"password": true
}
]
}
Cursor
.cursor/mcp.json:
{
"mcpServers": {
"oneuptime": {
"url": "https://oneuptime.com/mcp",
"headers": {
"x-api-key": "your-api-key-here"
}
}
}
}
セルフホスト型インスタンスの場合は、上記のいずれかで oneuptime.com を OneUptime のホスト名に置き換えてください。
認証
API キー
OneUptime の Project Settings → Advanced → API Keys でプロジェクト API キーを作成し、エージェントに必要な最小限の権限を付与してください(読み取り専用キーで、すべての get_/list_/count_ ツールを使用できます)。プロジェクトはキーから推定されるため、作成ツールで projectId 引数を指定する必要はありません。
警告 — AI エージェントにマスターキーを渡さないでください。 OneUptime のマスター API キーもこのヘッダーで受け付けられ、インスタンス全体の管理者権限が付与されます。AI エージェントには、必ず最小限の権限を持つプロジェクトスコープの API キーを使用してください。
公開ステータスページのツールと oneuptime_help/oneuptime_list_resources は、認証情報なしで使用できます。
OAuth サインイン
コードは OAuth/ にあり、各ファイルの冒頭にその設計理由が記載されています。構成は次のとおりです。
/mcp配下に単一の発行者があります。https://<host>/mcpは、保護対象リソース(RFC 9728)であり、認可サーバーの発行者(RFC 8414)でもあります。すべてのエンドポイントは/mcp/oauth配下にあり、すべての URL はリクエストではなくHOST/HTTP_PROTOCOLから構築されます。- HTTP レイヤーで遅延認証を行います。
OAuth/RequestGateは、MCP SDK がリクエストを受け取る前に実行されます。initialize、tools/list、公開ツールは認証情報なしで通過します。ID が必要なツールの呼び出しは、Bearer チャレンジとともに401で拒否されます(または、読み取り専用の許可で書き込みツールを呼び出した場合は403 insufficient_scope)。ツールハンドラー内では実現できません。SDK 内で拒否するとステータスは200になり、クライアントがユーザーのサインインを開始するのは実際の401が返されたときだけです。 - クライアントは自らを識別します。 クライアント ID メタデータドキュメント(
OAuth/ClientIdMetadataDocument。エグレスガードを経由して取得し、プライベートアドレスは常にブロックします)または動的クライアント登録(OAuth/RegistrationEndpoint)を使用します。手動でクライアントを登録する必要はありません。 - 認可コード + PKCE(S256 のみ)、リソースインジケーター(RFC 8707)、認可レスポンス内の
iss(RFC 9207)、再利用検知付きのローテーション式リフレッシュトークン、失効(RFC 7009)に対応しています。 - 不透明なトークンをハッシュで保存します。
oumcp_ac_…/oumcp_at_…/oumcp_rt_…。保存されるのは SHA-256 のみです(McpOAuthToken)。許可(McpOAuthGrant)とは、1 つのプロジェクトで 1 人のメンバーが 1 つのクライアントを代理として利用できる単位です。許可を取り消すには許可を削除します。関連するトークンも連鎖して削除されます。 - 認証情報となるのはアクセストークンのみです。
x-api-keyに含められるのは API キーだけです。Authorizationには API キーまたはアクセストークンを含められます。どちらのヘッダーに渡された場合でも、その他のoumcp_シークレット(リフレッシュトークン、コード、クライアントシークレット、x-api-key内のアクセストークン)は、OAuth/RequestGateによって401 invalid_tokenで拒否され、API キーとして API に渡されることはありません。 - スコープは
mcp:readとmcp:writeです(write は read を含みます)。同意画面では、クライアントが要求したスコープを狭めることはできますが、広げることはできません。 - API がクライアントのトークンを受け取ることはありません。 アクセストークンが受理されると、MCP レイヤーは 60 秒間有効な署名付き委任トークン(
Common/Server/Utils/Mcp/McpDelegationToken)を使って REST API を呼び出します。Common/Server/Middleware/McpDelegationAuthorizationは、そのトークンを使って、マスター管理者ではなくメンバーとして許可されたリクエストに変換します。リクエストは許可の対象プロジェクト内で、メンバーの現在の権限を適用し、許可が読み取り専用の場合は読み取り専用としてマークされます。そのため、アクセストークンが盗まれても、その価値は MCP ツールで実行できる操作の範囲に限られます。 - 使用のたびに確認します。
Common/Server/Utils/Mcp/McpOAuthGrantAccessは、リクエストごと、トークン交換ごとに許可を再評価します。メンバーが引き続き存在し、ブロックされておらず、プロジェクトに所属し、AuthorizeMcpClientをブロックするチームに所属しておらず、プロジェクトの SSO 要件も引き続き満たしていることを確認します。 - 同意は Accounts ページの
/accounts/mcp-authorizeで行います。接続済みクライアントの管理は、Dashboard の Settings → MCP Server で行います。
設定は 2 つあります。DISABLE_MCP_OAUTH=true を設定すると機能全体が無効になります(ルートは 404 を返し、認証されていないツール呼び出しには、従来どおりインバンドで「API キーが必要です」という結果が返されます)。DISABLE_MCP_OAUTH_CLIENT_ID_METADATA_DOCUMENTS=true は、外部へのリクエストを送信できないインスタンス向けの設定です。
ツールカタログ
データベースのリソース — 完全な CRUD
以下の 27 モデルは、それぞれ 6 つのツールを持ちます:create_、get_、list_、update_、delete_、count_(例:create_incident、get_incident、list_incidents、update_incident、delete_incident、count_incidents)。
Incident、Alert、Incident Alert、Monitor、Status Page、Scheduled Maintenance Event、Team、Monitor Status、On-Call Policy、Incident State、Incident Severity、Alert State、Alert Severity、Incident State Timeline、Alert State Timeline、Incident Public Note、Incident Internal Note、Alert Internal Note、Status Page Announcement、Scheduled Maintenance State、Scheduled Maintenance State Timeline、Label、Monitor Status Event、Security Case、Security Case Note、Security Detection、Security Playbook。
テレメトリのリソース — 読み取り専用
Log、Metric、Span、Exception Instance、Monitor Log、Security Event、Change Event、Kubernetes Cost Allocation、Threat Intel Indicator には、list_ と count_ ツールのみが用意されています(例:list_logs、count_spans、list_exception_instances)。テレメトリには作成ツールがありません。データの取り込みは OpenTelemetry 経由で行われます。
ワークフローツール
インシデント/アラート対応に特化したショートカットです(packages/App/FeatureSet/MCP/Tools/WorkflowTools.ts)。
acknowledge_incident、resolve_incidentacknowledge_alert、resolve_alertadd_incident_note(visibility: "internal" | "public"を指定できます。公開ノートはステータスページに投稿されます)add_alert_noteoneuptime_whoami— 認証情報が属するプロジェクト(ID と名前)を返します。OAuth サインインの場合は、サインイン中のユーザー、使用しているクライアント、接続が読み取り専用かどうかも返します。
ヘルパーツールと公開ツール
oneuptime_help、oneuptime_list_resources- 認証情報は不要です:
get_public_status_page_overview、get_public_status_page_incidents、get_public_status_page_scheduled_maintenance、get_public_status_page_announcements
アノテーションと結果
すべてのツールにはタイトルがあり、Tools/ToolAnnotations.ts で 3 つすべての MCP ヒントを指定しています。これにより、クライアントは安全な呼び出しを自動承認し、それ以外の呼び出しでは確認を求められます。
- 何も変更しないツールには
readOnlyHint: trueを設定します:get_、list_、count_、oneuptime_whoami、ヘルパーツール、公開ステータスページツール。 - 何かを変更するすべてのツールには
destructiveHint: trueを設定します:作成、更新、削除ツール、確認と解決、ノートの追加。書き込み操作の多くは、レコードの上書きや削除、インシデントまたはアラートの状態変更、オンコール担当者へのページ送信、ステータスページへの投稿を行います。また、ディレクトリでfalseが許可されるのは、追加のみで何も送信しない書き込み操作に限られます。 openWorldHint: trueは、インスタンス上の任意の公開ステータスページを読み取る公開ステータスページツールにのみ設定します。それ以外のすべてのツールは、呼び出し元のプロジェクト内でのみ動作します。
MCP ディレクトリではこれらの指定が必須です。Claude Connectors Directory は、title または readOnlyHint/destructiveHint がないツールにフラグを立てます。また、ChatGPT は 3 つすべてのヒントをブール値で指定することを求めます。Tests/ToolAnnotationsForDirectories.test.ts は、いずれかが欠けているツール、または上記のルールに違反するツールがあると失敗します。サーバー自体では、MCP_ALLOW_DESTRUCTIVE=false にすると削除ツールのみが除外され、MCP_READ_ONLY=true にすると読み取り専用ではないすべてのツールが除外されます(Tests/WritePolicy.test.ts)。ツールの結果には、JSON テキストに加えて structuredContent が含まれます。エラーはプロトコルエラーではなく、statusCode、details、suggestion を含むインバンドのツール結果(isError: true)として返されます。
クエリ、ソート、選択、ページネーション
クエリ
クエリフィールドには、直接値または演算子オブジェクトを指定できます。
{
"query": {
"title": { "_type": "Search", "value": "database" },
"createdAt": { "_type": "GreaterThan", "value": "2026-07-01T00:00:00.000Z" }
}
}
演算子:EqualTo、NotEqual、IsNull、NotNull、EqualToOrNull、GreaterThan、LessThan、GreaterThanOrEqual、LessThanOrEqual、InBetween、Search、Includes。
ソート
{ "sort": { "createdAt": "DESC" } }
値は "ASC" または "DESC" です。
選択
get_ ツールと list_ ツールでは、フィールド名の配列 select を任意で指定できます。デフォルトでは、読み取り可能なすべてのフィールドが返されます。ただし、サイズの大きいフィールド(JSON/VeryLongText/HTML の列)は除外されるため、取得するには明示的に指定する必要があります。
ページネーション
limit のデフォルトは 10(最大 100)です。skip は結果セット内のオフセットを指定します。リストのレスポンスには、要求されたページ全体と正確なページネーションメタデータが返されます。
{
"returnedCount": 10,
"totalCount": 42,
"skip": 0,
"limit": 10,
"hasMore": true,
"data": ["..."]
}
ワークフローの例
エージェントが実行できる、一般的なインシデント対応の流れです。
oneuptime_whoami— 認証情報がどのプロジェクトに属しているかを確認します。{"sort": {"createdAt": "DESC"}, "limit": 5}を指定してlist_incidentsを実行 — アクティブなインシデントを見つけます。acknowledge_incident— 担当を引き受けます。- 時間範囲フィルター(
{"time": {"_type": "GreaterThan", "value": "..."}})を指定してlist_logsを実行し、list_exception_instancesを実行 — 調査します。 "visibility": "public"を指定してadd_incident_noteを実行 — 顧客向けに状況を更新します。resolve_incident— インシデントを解決します。
HTTP エンドポイント
| エンドポイント | メソッド | 動作 |
|---|---|---|
/mcp | POST | JSON-RPC(ツール呼び出しおよびすべての MCP 操作) |
/mcp | GET | SSE の Accept ヘッダーがない場合:わかりやすい JSON の検出ペイロードを返します。ヘッダーがある場合:405(ステートレスモードでは単独の SSE ストリームはありません)。 |
/mcp | DELETE | 何もしません(ステートレスのため、終了する対象はありません) |
/mcp/tools | GET | 利用可能なツールの REST 一覧 |
/mcp/health | GET | このビルドが対応するプロトコルバージョンを含むヘルスチェック |
/mcp/.well-known/oauth-protected-resource | GET | 保護対象リソースのメタデータ(/.well-known/oauth-protected-resource[/mcp] でも利用可能) |
/.well-known/oauth-authorization-server/mcp | GET | 認可サーバーのメタデータ(/mcp/.well-known/oauth-authorization-server およびオリジンのルートでも利用可能) |
/mcp/oauth/authorize | GET, POST | 認可エンドポイント:クライアントのリクエストを確認し、同意画面にリダイレクトします |
/mcp/oauth/token | POST | コードの交換と更新 |
/mcp/oauth/register | POST | 動的クライアント登録 |
/mcp/oauth/revoke | POST | トークンの取り消し |
/mcp/oauth/consent/{details,approve,deny} | POST | 同意画面自体の呼び出し(セッション Cookie、同一オリジンのみ) |
プロトコル互換性
サーバーは拒否するのではなくネゴシエーションを行うため、クライアントは App コンテナにバンドルされている MCP SDK と完全に一致している必要はありません。
プロトコルバージョン。 MCP-Protocol-Version リクエストヘッダーは、双方がサポートする最も新しいバージョンにネゴシエーションされます。ヘッダーが二重に送信された場合は、最初の値が読み取られます。Node は重複したヘッダーをカンマで連結した単一の文字列にまとめますが、バージョンにカンマが含まれることはありません。
- サーバーがサポートするバージョンは、そのまま使用されます。
- サーバーが把握しているどのバージョンよりも 新しい バージョン(たとえば、仕様の新しいリビジョンを使うクライアント)の場合は、サーバーがサポートする最新バージョンにネゴシエーションされます。これは
initializeが返すものと同じです。 - サーバーがサポートするどのバージョンよりも 古い バージョン、または
YYYY-MM-DD形式のバージョンでないものは、共通のバージョンがありません。リクエストには400と、要求されたバージョンを示し、サポート対象のバージョンを列挙する JSON-RPC エラーが返されます。トランスポート層で黙って失敗することはありません。
initialize リクエストの使用不能なヘッダーは拒否せずに破棄されます。このリクエストでは、本文でバージョンをネゴシエーションするためです。存在していても 空白の ヘッダーも破棄されます。空文字列は SDK にとってヘッダーが存在しない場合と同じではなく、破棄しなければ、ほかの未知のバージョンと同様に SDK が拒否するためです。
GET /mcp と GET /mcp/health はどちらもサポート対象のバージョンを一覧表示するため、コンテナのログを確認せずにハンドシェイクの失敗を診断できます。
レスポンス形式。 POST への応答には、クライアントの Accept ヘッダーで許可されている形式が使われます。クライアントが text/event-stream を名前で指定するか、text/* の範囲で要求している場合(仕様に準拠した MCP クライアントの動作)は text/event-stream が、それ以外の場合はプレーンな application/json の本文が返されます。これには Accept: application/json、application/* や */* のワイルドカード、Accept ヘッダーがない場合も含まれます。MCP 仕様では、POST に対するこれらの応答はどちらも有効です。どちらの形式も受け入れないクライアントには、エンドポイントが生成できるメディアタイプを示す 406 が返されます。
診断。 ネゴシエーションのログは クライアント の情報を示します。ヘッダーを書き換える前に取得したスナップショットに基づいているため、サーバーが正規化した値ではなく、実際に送信された値が記録されます。ヘッダー値や JSON-RPC メソッドなど、ログ内のすべてのフィールドから制御文字が取り除かれ、長さも制限されるため、呼び出し元がログ行を偽造したり、ログを大量のデータであふれさせたりすることはできません。API キーやアクセストークンがログに記録されることはありません。
セルフホスト
MCP サーバーは App コンテナの一部として提供され、Nginx 経由で /mcp からアクセスできます。別途デプロイする必要はありません。そのツールは、App の内部アドレスである SERVER_APP_HOSTNAME と APP_PORT(App サービスの環境から引き継がれ、Nginx が /api をプロキシするアドレス)を使って OneUptime API を呼び出します。公開用の HOST を経由することはありません。App コンテナから HOST に常にアクセスできるとは限らず、HOST=localhost の場合はコンテナ自体を指すためです。サーバーに API キーが設定されることはありません。クライアントがリクエストごとにキーを提供します。
OAuth サインインにも設定は不要ですが、HOST と HTTP_PROTOCOL が実際にユーザーが使用するアドレスになっている必要があります。発行者、トークンのオーディエンス、ディスカバリードキュメント内のすべてのエンドポイントは、これらの値から構築されます。OneUptime の前段にリバースプロキシがある場合は、/.well-known/oauth-protected-resource と /.well-known/oauth-authorization-server(およびそれら以下のすべて)を /mcp とともに App に転送する必要があります。バンドルされている Nginx はこの転送を行います。
MCP レジストリ
OneUptime Cloud のサーバーは、MCP クライアントやディレクトリが参照する公式の MCP レジストリに、com.oneuptime/mcp として登録されています。server.json がそのエントリーです。ストリーミング可能な HTTP で https://oneuptime.com/mcp に接続し、OAuth でサインインするか、任意の x-api-key ヘッダーにプロジェクト API キーを指定します。version は 0.0.0 というプレースホルダーです。
各リリースでは、そのリリースのバージョンで公開されます。.github/workflows/release.yml の publish-mcp-registry ジョブは、GitHub リリースの公開後に Scripts/MCP/PublishToMcpRegistry.sh を実行します。レジストリにすでに存在するバージョンはスキップするため、リリースを再実行しても二重に公開されることはありません。一度公開したバージョンは変更できません。
com.oneuptime で公開できるのは、oneuptime.com を管理する人だけです。このジョブは、公開鍵が oneuptime.com の TXT レコードに登録されている Ed25519 秘密鍵を使ってサインインします。両方が設定されるまでは、公開せずに失敗します。設定するには、次の手順に従ってください(Ed25519 には OpenSSL 3 が必要です。macOS では brew install openssl@3 を実行し、システムの LibreSSL ではなく、インストールした openssl を使用してください)。
-
鍵ペアを作成します。
openssl genpkey -algorithm Ed25519 -out mcp-registry-key.pem -
_mcp.oneuptime.comのようなサブドメインではなく、oneuptime.com自体に TXT レコードを追加し、次のコマンドで表示される値を設定します。echo "v=MCPv1; k=ed25519; p=$(openssl pkey -in mcp-registry-key.pem -pubout -outform DER | tail -c 32 | base64)" -
リポジトリの Settings → Environments で
mcp-registry-publishを作成し、デプロイ可能なブランチをreleaseに制限して、シークレットMCP_REGISTRY_PRIVATE_KEYを設定します。値は、次のコマンドで表示される秘密鍵の 16 進数表記です。openssl pkey -in mcp-registry-key.pem -noout -text | grep -A3 "priv:" | tail -n +2 | tr -d ' :\n'
その後、mcp-registry-key.pem を削除するか、安全な場所に保管してください。この鍵を持つ人は、com.oneuptime 配下のすべてのエントリーを公開および上書きできます。鍵を変更する場合は、TXT レコードとシークレットを同時に置き換えてください。古いレコードを新しいレコードと併せて残すと、古いレコードが先に試され、サインインに失敗します。
次のリリースを待たずに公開するには、mcp-publisher と jq をインストールし、リポジトリのルートからスクリプトを手動で実行します。PACKAGE_VERSION=<version> MCP_REGISTRY_PRIVATE_KEY=<hex key> bash Scripts/MCP/PublishToMcpRegistry.sh
ChatGPT プラグインディレクトリ
ChatGPTPlugin/ は、OneUptime が ChatGPT と Codex の共通ディレクトリである ChatGPT プラグインディレクトリにアップロードするパッケージです。掲載情報、肯定的なレビュー用テストケース 5 件と否定的なレビュー用テストケース 3 件、および https://oneuptime.com/mcp を指定し、読み取りと書き込みのアクセスに OAuth でサインインする mcp.json が含まれています。npm run build-chatgpt-plugin で ZIP ファイルをビルドします。提出時に必要なその他の項目は README に記載されています。認証済みの開発者 ID、https://oneuptime.com/.well-known/openai-apps-challenge で提供するドメイン検証トークン、デモプロジェクト用のレビュアー認証情報、およびデモ動画です。Tests/ChatGPTPlugin.test.ts は、パッケージが Agent Plugins のスキーマと OpenAI の制限に準拠していることを検証し、各テストケースで指定されるすべてのツールがこのサーバーに存在することも確認します。
開発
MCP サーバーは packages/App/FeatureSet/MCP にあり、起動時に App サービスへマウントされます(packages/App/Index.ts)。テストは packages/App/FeatureSet/MCP/Tests にあり、App のテストスイートの一部として実行されます。
cd packages/App
npm install
npx jest ./FeatureSet/MCP/Tests --runInBand
新しいモデルは自動的に検出されます。データベースモデルに @EnableMCP を付けるか、分析モデルで enableMCP を設定すると、次回の起動時にツールジェネレーターがそのモデルのツールを作成します。
ライセンス
Apache-2.0 - 詳細については LICENSE ファイルを参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。