• Projects
  • Service
  • About
  • branding.bz
  • Podcast
  • Tips
  • FAQ
  • Recruit
  • Download
  • Contact
  • branding.bz(ブランド構築SaaS)
  • DESIGN NOW(デザインメディア)
  • X
  • LinkedIn
  • Spotify
  • Facebook

213-0011 神奈川県川崎市高津区久本3-6-7-303

© 2026 ID INC. All rights reserved

claude-skills/スキル
SKILLOfficialmonitoring

catalog

プラグイン
incident-io
ソース
GitHub で見る ↗
説明

incident.ioの組織カタログ機能です。これはサービスやチーム、コンポーネント、顧客、ユーザーなど、組織が管理するあらゆるもの(のタイプと個別データ)、それらの属性、およびそれらの間のつながりを記録したものです。 次のような場合に使用します: - これらの情報を何らかの方法で参照する場合全般 - 単純な検索を行う場合(「チェックアウト機能は誰が管理していますか?」「Atlasとは何ですか?」「サーチ機能に依存しているものは何ですか?」「プラットフォームチームのメンバーは誰ですか?」など) - 設定値を変更する前や案件をエスカレーション(引き上げ)する前に、データの一意のIDを確認する場合 **重要:** カタログまたはチームに関する最初のツール呼び出しの前に、あらかじめ本スキルを読み込んでください。各ツールが返す未加工のデータと相互参照を、本スキルを使って正しく照合し、つながりを追跡するためです。 **対象外:** オンコール(当番)スキルで扱う勤務シフト表の管理、または「システムの内部的な仕組み」に関する情報(アーキテクチャドキュメントなど)は、このスキルの対象ではありません。ただしそうしたシステムについても、最初はこのカタログで主体を確認します。

原文を表示

The organisation's catalog in incident.io: its types and entries (services, teams, components, customers, users and whatever else it models), their attributes, and the references between them. Use whenever you're working with any of these in any way, including plain reads ("who owns checkout?", "what is Atlas?", "what depends on search?", "who's in the platform team?") and finding an entry's ID before setting a field or escalating. Load it before the first catalog or team tool call: the tools return raw entries and references, and this skill says how to prove a match and walk a reference. Not for schedule rotas and shifts (the on-call skill), nor how a system works internally (architecture docs, but ground the subject here first).

ユースケース
  • 組織が管理する情報を参照する
  • サービスやチームを検索する
  • コンポーネント間の依存関係を確認する
  • 設定変更前にデータIDを確認する
  • 案件エスカレーション前に情報を確認する
本文(日本語訳)

カタログ

カタログは、組織が自分自身を構造化した地図です。タイプ(サービス、チーム、顧客など)がそれぞれ属性スキーマを持ち、エントリ(検索インデクサー、データプラットフォームなど)がそれらの属性の値を保有しています。別のエントリを参照する属性は名前 (ID)の形で表示され、括弧内のIDがジャンプ先です。カタログは絶対的な情報源です。会話やインシデント(事象)の文脈がカタログと異なる場合、カタログが正しく、その旨をお伝えします。

タイプの3つの種類

type_nameで区別されます:

  • Custom["…"] — 組織が独自に定義したタイプで、組織に関する質問に最適なことが多いです。まずこれを検索しますが、エントリが手動で追加されたと仮定してはいけません。
  • ネイティブ(EscalationPath(呼び出し経路)、Schedule(スケジュール)、User(ユーザー)、AlertPriority(アラート優先度)など)— incident.ioが管理するリソースです。チームはネイティブではなく、通常はCustom["Team"]という組織定義型に存在するため、チーム名を推測するのではなくteam_listとteam_showを使用してください。個人の連絡先(メールアドレスや電話番号)はそのユーザーエントリに保存されています。ユーザーを解決してからエントリを読んでください。
  • 統合同期型(GitHubRepository(GitHub リポジトリ)、PagerDutyService(PagerDuty サービス)、SlackChannel(Slack チャネル)など)— 外部ツールのミラーで、数千のエントリがあることもあります。ユーザーが統合の名前を明示的に挙げた場合だけ検索してください。「取り込みサービス」は組織のサービスエントリを指し、GitHub リポジトリではありません。

エントリの所有者情報

type_nameはタイプの種類を示しますが、誰がエントリを管理しているかは別です。そのためにはcatalog_type_listからregistry_typeとis_editableを確認してください。registry_typeを持つタイプはincident.ioが管理しており、編集できません。持たないタイプはincident.ioによる同期ではありませんが、catalog-importer(カタログ取り込みツール)やTerraformなどの外部ジョブがAPIを通じて書き込むことがあります。これらのツールからは見えないため、これを「統合同期型でない」と呼びます。属性のmode(形式)はそのフィールドについて説明します。出所に関する質問には、情報源と編集可能性の判定を先に述べ、この留意事項も添えてください。属性のリストやエントリ数は、聞かれない限り省略してください。

incident.ioコネクションのcatalog_type_list、catalog_entry_list、catalog_entry_showツールを直接使用してください。初めて使う前に、各ツールの入力スキーマを確認してください。コネクションが利用できない場合、何が確認できなかったかを述べてください。エントリを作り上げてはいけません。

検索前に全体像をつかむ

1回のcatalog_type_list呼び出しで、すべてのタイプが属性スキーマを含めて返されます。会話ごとに最初の検索の前に一度全体像をつかみ、どのタイプが対象を保有できるか、どの属性チェーンが答えに到達するかを計画してください。すべての組織のカタログは独自の構成になっています。ここで示すタイプ名や属性名は例です。推測で型名を指定すると(例えばServiceの代わりにCustom["Service"]を使わない)、何もマッチせず、エントリが存在しないように見えます。

エントリの探し方

  • 質問に含まれる型ヒントに基づいて検索範囲を決めてください。型が明記されている場合(「チェックアウトサービス」、「課金を担当するチーム」)は、そのタイプとその周辺タイプに絞ります。名前だけの場合(「Atlas とは何ですか?」)は型の手がかりがないため、組織のカスタム型を並行して検索してください。管理型タイプは数が少ないため、その後でネイティブ型や統合型を検索します。単一タイプの検索が正当化されるのは、質問で型が明記された場合だけです。

  • 検索はエントリ名と識別子のみにマッチします。説明や属性値は対象ではありません。ヒットしなかった場合、「検索した型に存在しない」を意味し、「存在しない」ではありません。小さなタイプはエントリが存在しないと結論付ける前に、すべてをリストアップしてください。

  • **検索ヒットは正確な識別子ではありません。**アラートやフィールド値は、エントリのID、外部ID、別名によってマッチします。タイプのuse_name_as_identifierが真の場合のみ、名前でマッチします。identifierで一致を確認し、そのフラグが偽の場合、表示名をマッチング値として提示しないでください。

  • 不在はタイプ固有です。 catalog_type_listはスキーマを説明するものであり、エントリではありません。サービスの検索では、顧客が同じ名前のエントリを持つかどうかを確認できません。「顧客エントリがマッチしない」と述べる前に、その名前または識別子で顧客を照会してhas_more: falseまでページングしてください。そうでなければ「顧客は確認されなかった」と述べてください。「このサービスへのスキーマリンクがない」ことは「マッチする顧客エントリがない」こととは異なります。

  • 1つの名前が複数のタイプのエントリにマッチする場合(「Atlas」というコンポーネントと「Atlas」というプロジェクト)、両方の候補、それらの型、IDを前に述べてください。それらの間の参照があっても、アラートが名付ける方を証明しません。区別が重要な場合、後から決定するのではなく、アラートまたはその識別子を先に尋ねてください。一方を答えとして見出しにし、もう一方を後から述べてはいけません。

  • フィルター検索のヒットは、タイプのサイズではありません。検索したタイプ内のマッチと呼んでください。タイプ全体数は、信頼できるカウントまたはフィルターなしで最後までページングしたリストからのみ主張してください。has_more: trueはリストが完全ではないことを意味します。

関係性の追跡

参照はそれを指すエントリに存在し、ツールはその方向のみを読みます。 すべての関係に関する質問は、「どのタイプのスキーマが属性を保有しているか」と問うことから始めてください。

  • 順方向(対象がその属性を保有する — 「検索インデクサーの所有者は誰ですか?」):エントリの属性値から名前 (ID)を直接読んでください。対象の完全で切り詰められていない属性が必要な場合、catalog_entry_show <id>を使用してください。

  • 逆方向(他のエントリが対象を指す — 「メッセージバスを呼び出すものは何ですか?」、「データプラットフォームチームが所有するものは何ですか?」):参照は指すエントリに存在し、対象の送信属性には存在しません。スキーマ内で参照元のタイプと属性IDを見つけ、attribute_filtersでcatalog_entry_listを呼び出してください:[{ "attribute_id": "<参照元属性ID>", "operator": "one_of", "entry_ids": ["<対象ID>"] }]。これは対象のID、外部ID、別名にマッチし、マッチするエントリのみをページングします。不明または廃止された対象はエラーであり、依存関係がないことの証明ではありません。

  • 未割り当てまたは未設定(「所有者がないサービスはどれですか?」):参照フィルターでoperator: "is_blank"を使用してください。アーカイブされた所有者への参照は名前 (廃止) (ID)と読め、設定済みと見なされるため、is_blankは決して返しません。これらを空のエントリとは別に報告してください。

  • 複合条件(「未割り当てで優先度1のサービス」):同じattribute_filtersリスト内に属性ごとに1つのフィルターを配置してください。それらはAND結合されるため、手動での交差判定は不要です。

  • 現在の状態のみ、履歴ではない: is_blankまたはis_setスキャンは現在設定されているものだけを表示します。「現在未設定」と述べてください。履歴読み取りなしに「設定されたことがない」と述べてはいけません。

  • 所有者の完全な内訳: 同じ参照属性についてis_blankとis_setの両方をhas_more: falseまでページングしてください。一緒にアクティブなエントリを分割し、カウントがタイプ全体を再度リストアップせずに合計を示します。設定された側では、(廃止)参照を別にリストアップしてください。保存された値が必ずしも有効な所有者であるとは限りません。

  • マルチホップ(「X がダウンした場合、どの顧客が影響を受けますか?」):フィルター付き逆ホップを意図的に連鎖させてください。Xの依存関係、次にサービスからそれらを参照するタイプへ。各ホップでスキーマを確認し、チェーンが何を確立し、何を確立しなかったかを述べてください。

カウントだけが必要な場合は、属性フィルターなしでinclude_total_count: trueをリクエストしてください。小さいpage_sizeはそのカウントのためだけに全ページを引き出すのを回避します。カウントはオプションでタイムアウトすることがあります。カウントが不在の場合、合計を主張する前にhas_more: falseまでページングしてください。searchからのカウントはその検索のためだけです。タイプ全体ではありません。

チームメンバーシップ

team_show.members.itemsは、設定されたチーム属性のユーザーIDと名前を持つ直接メンバーを保有しています。members.pagination.next_cursorに従い、has_moreが偽になるまで、完全なメンバー一覧を得てください。members.configured: falseは空のチームではありません。これらは直接メンバーであり、子チームを通じて継承したすべてのメンバーではありません。個人のチームについては、その User エントリを見つけ、設定されたチームタイプをone_of属性フィルターでメンバー属性にフィルターしてください。職務経歴書や Slack グループをチームエントリで代用してはいけません。team_show.resources.itemsはチームを指しているカタログエントリではなく、リンクされた運用リソースをリストアップします。空のリストはチームがサービスを所有していないことを決して証明しません。上記の逆参照を使用する前に、その主張を立ててください。

チーム階層については、親参照は子に保存されることを覚えてください。チームから順方向に読むと、その祖先が得られます。子孫については、チームタイプをフィルターしてone_of属性フィルターで親属性に開始チームを指定し、見つかった各チームについて繰り返し、各レベルをhas_more: falseまでページングしてください。開始チームは自分自身の子孫ではありません。その下の異なるチームをIDと共にリストアップしてください。子孫カウントは聞かれた場合のみ、完全なセットから開始チームのIDを除いた後にのみ提供してください。

サービスのエスカレーション経路(呼び出し経路)の検索

「サービスまたはコンポーネントのためにページングされるのは誰ですか」はカタログウォークから始まります。スケジュールはサービス所有権ではなく、人とシフトについて知っています。

  1. サービスエントリを見つけ、その所有者参照をたどってください(チームまたはEscalationPathにリンクする属性についてスキーマを確認してください)。

  2. その参照に支えられたチームと経路を述べてください。team_showはチームの経路をリストアップできます。escalation_path_listは名前で検索しますが、同じ名前の経路はそのサービスがそれを使用することの証明ではありません。

  3. 所有者参

原文(English)を表示

Catalog

The catalog is the organisation's structured map of itself: types (Service, Team, Customer…) each with a schema of attributes, and entries (search-indexer, Data Platform…) holding values for those attributes. Attributes that reference other entries render as Name (ID) — the ID in parentheses is how you hop. The catalog is authoritative: when conversation or incident context disagrees with it, the catalog wins, and you say so.

Three kinds of type, told apart by type_name:

  • Custom["…"] — org-defined types, often the best match for an organisational question. Search these first, but do not assume their entries were added by hand.
  • Native (EscalationPath, Schedule, User, AlertPriority…) — incident.io's own resources. Teams are not native: they live on an org-defined type, usually Custom["Team"], so use team_list and team_show rather than guessing its name. Contact details for a person (email, and phone numbers where the org exposes them) live on their User entry: resolve the person, then read the entry.
  • Integration-synced (GitHubRepository, PagerDutyService, SlackChannel…) — mirrors of other tools, often thousands of entries. Only search these when the user names the integration; "the ingest service" means the org's Service entry, not its GitHub repo.

Where a type's entries come from. type_name tells you which kind a type is, not who maintains its entries. For that, read registry_type and is_editable from catalog_type_list. A type with a registry_type is managed by incident.io, as its own resources or an integration it syncs, and isn't editable. A type without one isn't synced by incident.io, but an external job such as catalog-importer or Terraform may still write it through the API, and these tools can't see that: call it not integration-synced rather than hand-maintained. An attribute's mode describes that one field. For provenance questions, lead with the source and editability verdict plus that caveat; omit attribute inventories and entry counts unless asked.

Use the incident.io connection's catalog_type_list, catalog_entry_list and catalog_entry_show tools directly. Inspect a tool's input schema before first use. If the connection is unavailable, say what could not be checked; do not invent an entry.

Orient before you search

One catalog_type_list call returns every type with its attribute schema. Orient once per conversation, before your first search, and plan the whole walk from it: which types could hold the subject, which attribute chain reaches the answer. Every org's catalog is bespoke — type and attribute names here are examples, and a guessed type_name (Service instead of Custom["Service"]) matches nothing and looks like the entry doesn't exist.

Finding an entry

  • Let the question's own type hint set your search breadth. A typed mention ("the checkout service", "the team that owns billing") narrows to that type and its neighbours; a bare name ("what is Atlas?") tells you nothing about kind, so sweep the org's custom types in parallel — curated types are few — before native or integration ones. A single-type search is only justified when the question named the type.
  • Search matches entry names and identifiers only — not descriptions or attribute values. A miss means "not in the types searched", never "doesn't exist". List a small type outright before concluding an entry isn't there.
  • A search hit is not an exact identifier. An alert or field value matches an entry by its ID, external ID or an alias, and by its name only when the type's use_name_as_identifier is true. Prove a match with identifier, and never offer the display name as a value that will match when that flag is false.
  • Absence is type-local. catalog_type_list describes schemas, not entries: a Service search cannot establish whether Customer has a similarly named entry. Before saying "no Customer entry matches", query Customer for that name or identifier and page to has_more: false; otherwise say Customer was not checked. "No schema link to this service" is different from "no matching Customer entries."
  • When one name matches entries in several types (an "Atlas" component and an "Atlas" project), lead with both candidates, their types and IDs. A reference between them does not prove which one an alert names; ask for the alert or its identifier if the distinction matters. Don't headline one as the answer and mention the other later.
  • A filtered search's hits are not the size of a type. Call them matches in the types searched; claim a type total only from an authoritative count or an unfiltered list paged to the end. has_more: true means the listing is incomplete.

Walking relationships

The reference lives on the entry that points, and the tools only read that direction. Orient every relationship question by asking: which type's schema holds the attribute?

  • Forward (the subject holds the attribute — "who owns the search-indexer?"): read the Name (ID) straight off the entry's attribute value; catalog_entry_show <id> when you need the target's full, untruncated attributes.
  • Reverse (other entries point at the subject — "what calls the message-bus?", "what does the Data Platform team own?"): the reference lives on the entries that point, never on the subject's own outgoing attributes. Find the referencing type and attribute ID in the schema, then call catalog_entry_list with attribute_filters: [{ "attribute_id": "<referencing-attribute-id>", "operator": "one_of", "entry_ids": ["<subject-id>"] }]. It matches the target's ID, external ID and aliases and pages only the matching entries. An unknown or archived target is an error, not proof it has no dependents.
  • Unowned or unset ("which services have no Owner?"): filter the referencing type with operator: "is_blank" on the stored reference attribute. A reference to an archived owner reads Name (Archived) (ID) and counts as set, so is_blank never returns it: report those apart from the empty ones, not as unset.
  • Combined conditions ("unowned tier-1 services"): put one filter per attribute in the same attribute_filters list; they AND together, so no manual intersection.
  • Current state, not history: an is_blank or is_set scan only shows what is set now. Say "currently unset"; do not say "never set" without a historical read.
  • Complete owner breakdown: page both is_blank and is_set for the same stored reference attribute to has_more: false. Together they partition active entries, so their counts give the total without listing the entire type again. On the set side, list (Archived) references separately: a stored value is not necessarily a working owner.
  • Multi-hop ("which customers are affected if X goes down?"): chain the filtered reverse hops deliberately — to X's dependents, then from services to the type that references them. Check the schema at each hop, and name what the chain did and did not establish.

For a count alone, request include_total_count: true without an attribute filter; a small page_size avoids pulling a whole page just for that figure. The count is optional and can time out; when absent, page to has_more: false before claiming a total. A count from search is only for that search, not the type.

Team membership

team_show.members.items holds direct members with user IDs and names from the configured team attribute. Follow members.pagination.next_cursor until has_more is false for a full roster; members.configured: false is not an empty team. These are direct members, not everyone inherited through child teams. For a person's teams, find their User entry and filter the configured Team type by its members attribute with a catalog_entry_list one_of attribute filter; don't substitute a job title or Slack group for a Team entry. team_show.resources.items lists linked operational resources, not catalog entries pointing at the team: an empty list never proves the team owns no services. Use the reverse lookup above before making that claim.

For a team hierarchy, remember the parent reference is stored on the child: reading it forward from a team gives its ancestors. For descendants, filter the Team type with a one_of attribute filter on the parent attribute for the starting team, then repeat for each team found, paging each level to has_more: false. The starting team is not its own descendant: list the distinct teams below it with IDs. Give a descendant count only if asked, and only after excluding the starting team's ID from the complete set.

Finding a service's escalation path

"Who gets paged for a service or component" begins with a catalog walk: schedules know about people and shifts, not service ownership.

  1. Find the service entry and follow its owner reference (check the schema for the attribute linking to a Team or EscalationPath).
  2. Name the team and path backed by that reference. team_show can list a team's paths; escalation_path_list searches by name, but a similarly named path is not proof that the service uses it.
  3. If the Owner reference reads (Archived), lead with that: the team is archived and is not a current owner to contact. If the reference does not resolve at all, say so. Without a live owner, say no path for this service was verified, and send the user to confirm and update the Owner. Do not suggest a former parent, lead, successor, default path or platform on-call unless a read links it to this service.
  4. If the team resolves but has no linked path, say so. Members and similarly named paths do not establish routing; do not offer to page them.
  5. If the user asked for the current person or a future shift, hand the identified path to the on-call skill. The catalog's job ends at naming the path.

Resolving values for writes

This read skill cannot edit catalog entries or types. Explain the needed change, but do not offer to set Owner or edit a catalog entry. An incident custom-field write through another available tool is a separate action.

Before setting a catalog-typed custom field or escalating: resolve the name to an identifier with a catalog read, and pass the identifier, never the display name — names are ambiguous and case-drifted, and a write against the wrong entry lands on a real incident or pages a real person. If the resolution was fuzzy (several candidates, or a weak match), confirm with the user before the write, not after.

Answering

  • Asked to describe an org resource ("tell me about X", "what is X"), the catalog is the grounding: what X is in this org, who owns it, what it connects to. Documentation can add how it works — it never substitutes, because docs found by keyword may describe a different X than the entry the org actually operates.
  • Include IDs alongside names (Data Platform (01ABC…)) for anything the user might act on next — the next step, yours or theirs, needs the ID and shouldn't re-resolve it.
  • When asked for a complete list, deliver every matching entry's name and catalog ID after paging. Do not compress rows into a range or offer to give IDs later. If output is partial, state what is missing; count-only answers need not print entries.

原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。