claude-skills/neo4j-support-db/SKILL.md
知的障害・精神障害のある方(クライアント)の支援情報を包括的に管理するNeo4jグラフデータベース(port 7687)。禁忌事項・推奨ケア・キーパーソン・手帳/受給者証・かかりつけ医・支援記録などを照会・登録する。特定のクライアント名が話題に出たとき、「〇〇さんの情報」「禁忌事項」「ケア方法」「支援記録」「手帳の更新」「クライアントを照会」「障害福祉の利用者」などの発言時に必ずこのスキルを使用すること。汎用neo4j MCPツール(execute_query)でCypherを実行する。
npx skillsauth add kazumasakawahara/nest-support neo4j-support-dbInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
このスキルは、知的障害・精神障害のある方の支援情報を包括的に管理するNeo4jグラフデータベースに、汎用neo4j MCPツールを通じてアクセスし、計画相談支援業務を支援します。
対象ユーザー: 計画相談支援専門員、障害福祉サービス事業者、支援コーディネーター
主な機能:
注意: 緊急時対応は emergency-protocol スキルを使用してください。
| ツール | 用途 |
|--------|------|
| neo4j:execute_query | すべての読み取り・登録・更新(読み書き兼用。query に Cypher、任意で params) |
| neo4j:create_node / neo4j:create_relationship | 単純なノード/リレーション作成(任意。通常は execute_query で足りる) |
スキーマ確認が必要なときは
execute_queryでCALL db.schema.visualization()等を実行する(専用のスキーマ取得ツールは無い)。
| ノード | 用途 | 主要プロパティ |
|--------|------|----------------|
| :Client | 本人 | name, dob, bloodType |
| :LifeHistory | 生育歴 | era, episode |
| :Wish | 願い | content, status |
| ノード | 用途 | 主要プロパティ |
|--------|------|----------------|
| :CarePreference | 推奨ケア | category, instruction, priority |
| :NgAction | 禁忌事項 ★最重要★ | action, reason, riskLevel |
| :Condition | 特性・診断 | name, status |
| ノード | 用途 | 主要プロパティ |
|--------|------|----------------|
| :Certificate | 手帳・受給者証 | type, grade, nextRenewalDate |
| :PublicAssistance | 公的扶助 | type, grade |
| ノード | 用途 | 主要プロパティ |
|--------|------|----------------|
| :KeyPerson | キーパーソン | name, relationship, phone, role |
| :Guardian | 法的代理人 | name, type, phone, organization |
| :Supporter | 支援者 | name, role, organization |
| :Hospital | 医療機関 | name, specialty, doctor, phone |
| ノード | 用途 | 主要プロパティ |
|--------|------|----------------|
| :SupportLog | 支援記録 | date, situation, action, effectiveness, note, type, duration, nextAction |
| :AuditLog | 監査ログ | timestamp, user, action, targetType, targetName, details, clientName |
| リレーション | 方向 | プロパティ |
|-------------|------|-----------
| MUST_AVOID | Client → NgAction | — |
| REQUIRES | Client → CarePreference | — |
| HAS_CONDITION | Client → Condition | diagnosedDate |
| HAS_KEY_PERSON | Client → KeyPerson | rank(優先順位) |
| HAS_LEGAL_REP | Client → Guardian | — |
| HAS_CERTIFICATE | Client → Certificate | issuedDate, status |
| RECEIVES | Client → PublicAssistance | — |
| HAS_HISTORY | Client → LifeHistory | — |
| HAS_WISH | Client → Wish | — |
| TREATED_AT | Client → Hospital | since, status |
| SUPPORTED_BY | Client → Supporter | since, until |
| LOGGED | Supporter → SupportLog | — |
| ABOUT | SupportLog → Client | — |
| FOLLOWS | SupportLog → SupportLog | — (時系列チェーン) |
| AUDIT_FOR | AuditLog → Client | — |
| IN_CONTEXT | NgAction → Condition | — |
| ADDRESSES | CarePreference → Condition | — |
全クライアントの情報登録状況を一覧表示する。
MATCH (c:Client)
OPTIONAL MATCH (c)-[:MUST_AVOID]->(ng:NgAction)
OPTIONAL MATCH (c)-[:REQUIRES]->(cp:CarePreference)
OPTIONAL MATCH (c)-[:HAS_KEY_PERSON]->(kp:KeyPerson)
OPTIONAL MATCH (c)-[:HAS_CERTIFICATE]->(cert:Certificate)
OPTIONAL MATCH (c)-[:HAS_LEGAL_REP]->(g:Guardian)
RETURN
c.name AS 氏名,
c.dob AS 生年月日,
count(DISTINCT ng) AS 禁忌登録数,
count(DISTINCT cp) AS 配慮事項数,
count(DISTINCT kp) AS キーパーソン数,
count(DISTINCT cert) AS 手帳数,
count(DISTINCT g) AS 後見人
ORDER BY c.name
出力加工: 生年月日から年齢を計算して 生年月日(年齢) として併記すること。
例: 1995-03-15 → 1995-03-15(30歳)
マニフェスト4本柱すべての情報を1クエリで取得する。
MATCH (c:Client)
WHERE c.name CONTAINS $clientName
// 第1の柱:本人性
OPTIONAL MATCH (c)-[:HAS_HISTORY]->(h:LifeHistory)
OPTIONAL MATCH (c)-[:HAS_WISH]->(w:Wish)
// 第2の柱:ケアの暗黙知
OPTIONAL MATCH (c)-[:HAS_CONDITION]->(con:Condition)
OPTIONAL MATCH (c)-[:REQUIRES]->(cp:CarePreference)
OPTIONAL MATCH (c)-[:MUST_AVOID]->(ng:NgAction)
// 第3の柱:法的基盤
OPTIONAL MATCH (c)-[:HAS_CERTIFICATE]->(cert:Certificate)
OPTIONAL MATCH (c)-[:RECEIVES]->(pa:PublicAssistance)
// 第4の柱:危機管理ネットワーク
OPTIONAL MATCH (c)-[kpRel:HAS_KEY_PERSON]->(kp:KeyPerson)
OPTIONAL MATCH (c)-[:HAS_LEGAL_REP]->(g:Guardian)
OPTIONAL MATCH (c)-[:SUPPORTED_BY]->(s:Supporter)
OPTIONAL MATCH (c)-[:TREATED_AT]->(hosp:Hospital)
RETURN
c.name AS 氏名,
c.dob AS 生年月日,
c.bloodType AS 血液型,
collect(DISTINCT {era: h.era, episode: h.episode}) AS 生育歴,
collect(DISTINCT {content: w.content, status: w.status}) AS 願い,
collect(DISTINCT {name: con.name, status: con.status}) AS 特性_診断,
collect(DISTINCT {category: cp.category, instruction: cp.instruction, priority: cp.priority}) AS 配慮事項,
collect(DISTINCT {action: ng.action, reason: ng.reason, riskLevel: ng.riskLevel}) AS 禁忌事項,
collect(DISTINCT {type: cert.type, grade: cert.grade, nextRenewalDate: cert.nextRenewalDate}) AS 手帳_受給者証,
collect(DISTINCT {type: pa.type, grade: pa.grade}) AS 公的扶助,
collect(DISTINCT {rank: kpRel.rank, name: kp.name, relationship: kp.relationship, phone: kp.phone, role: kp.role}) AS キーパーソン,
collect(DISTINCT {name: g.name, type: g.type, phone: g.phone}) AS 後見人等,
collect(DISTINCT {name: s.name, role: s.role, organization: s.organization}) AS 支援者,
collect(DISTINCT {name: hosp.name, specialty: hosp.specialty, phone: hosp.phone}) AS 医療機関
パラメータ: $clientName
出力加工:
nullのエントリを除外するrank昇順でソート【基本情報】氏名 / 生年月日(年齢)/ 血液型
【第1の柱:本人性】生育歴、願い
【第2の柱:ケアの暗黙知】特性・診断、配慮事項、🚫禁忌事項
【第3の柱:法的基盤】手帳・受給者証、公的扶助
【第4の柱:危機管理ネットワーク】キーパーソン、後見人等、支援者、医療機関
各ノードタイプの登録数を確認する。1つのクエリで一括取得。
MATCH (n)
WHERE n:Client OR n:NgAction OR n:CarePreference OR n:Condition
OR n:KeyPerson OR n:Certificate OR n:Guardian OR n:LifeHistory
OR n:Wish OR n:Hospital OR n:Supporter OR n:SupportLog
WITH labels(n)[0] AS label
RETURN label AS ノード種別, count(*) AS 登録数
ORDER BY 登録数 DESC
MATCH (c:Client)-[:HAS_CERTIFICATE]->(cert:Certificate)
WHERE cert.nextRenewalDate IS NOT NULL
AND ($clientName = '' OR c.name CONTAINS $clientName)
WITH c, cert,
duration.inDays(date(), cert.nextRenewalDate).days AS daysUntilRenewal
WHERE daysUntilRenewal <= $days AND daysUntilRenewal >= 0
RETURN
c.name AS クライアント,
cert.type AS 証明書種類,
cert.grade AS 等級,
cert.nextRenewalDate AS 更新期限,
daysUntilRenewal AS 残り日数
ORDER BY daysUntilRenewal ASC
パラメータ: $clientName(空文字で全員), $days(デフォルト90)
出力加工: 残り日数で緊急度をグループ化:
MATCH (s:Supporter)-[:LOGGED]->(log:SupportLog)-[:ABOUT]->(c:Client)
WHERE c.name CONTAINS $clientName
RETURN log.date AS 日付,
s.name AS 支援者,
log.situation AS 状況,
log.action AS 対応,
log.effectiveness AS 効果,
log.note AS メモ
ORDER BY log.date DESC
LIMIT $limit
パラメータ: $clientName, $limit(デフォルト10、最大50)
複数回効果があった対応方法を自動検出する。
MATCH (s:Supporter)-[:LOGGED]->(log:SupportLog)-[:ABOUT]->(c:Client)
WHERE c.name CONTAINS $clientName
AND (toLower(toString(log.effectiveness)) STARTS WITH 'effective'
OR toLower(toString(log.effectiveness)) STARTS WITH 'excellent'
OR toString(log.effectiveness) CONTAINS '効果')
WITH log.action AS 対応方法, count(*) AS 回数,
collect(DISTINCT log.situation) AS 状況一覧
WHERE 回数 >= $minFrequency
RETURN 対応方法, 回数, 状況一覧
ORDER BY 回数 DESC
パラメータ: $clientName, $minFrequency(デフォルト2)
MATCH (al:AuditLog)
WHERE ($clientName = '' OR al.clientName CONTAINS $clientName)
AND ($userName = '' OR al.user CONTAINS $userName)
RETURN al.timestamp AS 日時,
al.user AS 操作者,
al.action AS 操作,
al.targetType AS 対象種別,
al.targetName AS 対象名,
al.details AS 詳細,
al.clientName AS クライアント
ORDER BY al.timestamp DESC
LIMIT $limit
パラメータ: $clientName(空文字OK), $userName(空文字OK), $limit(デフォルト30、最大100)
特定クライアントに絞った監査ログ。
MATCH (al:AuditLog)
WHERE al.clientName CONTAINS $clientName
RETURN al.timestamp AS 日時,
al.user AS 操作者,
al.action AS 操作,
al.targetType AS 対象種別,
al.targetName AS 内容,
al.details AS 詳細
ORDER BY al.timestamp DESC
LIMIT $limit
パラメータ: $clientName, $limit(デフォルト20)
データの登録・更新には neo4j:execute_query を使用する(読み取りと同じツール。書き込み Cypher を query に渡す)。
書き込み時のクライアント照合は完全一致
{name: $clientName}を使うこと。 部分一致(CONTAINS)は複数クライアントにヒットした場合、全員にデータが付与される事故につながる。 書き込み前にテンプレート1または2で正確な氏名を確定してから実行する。
旧システムでは Gemini API で支援記録テキストを構造化していたが、スキルベースの新システムでは Claude自身がテキストを構造化 してからCypherで登録する。
構造化の手順:
situation: 何が起きたか(状況)action: どう対応したか(対応)effectiveness: 効果があったか(Effective / Ineffective / Neutral)note: その他のメモ例: 「今日、急な音に驚いてパニックになりました。テレビを消して静かにしたら5分で落ち着きました。」 → situation: "急な音に驚いてパニック" → action: "テレビを消して静かにした" → effectiveness: "Effective" → note: "5分で落ち着いた"
MATCH (c:Client)
WHERE c.name CONTAINS $clientName
MERGE (s:Supporter {name: $supporterName})
CREATE (log:SupportLog {
date: date($date),
situation: $situation,
action: $action,
effectiveness: $effectiveness,
note: $note,
type: $type,
duration: $duration,
nextAction: $nextAction
})
MERGE (s)-[:LOGGED]->(log)
MERGE (log)-[:ABOUT]->(c)
// 直前の支援記録との時系列チェーンを構築
WITH log, c
OPTIONAL MATCH (prevLog:SupportLog)-[:ABOUT]->(c)
WHERE prevLog <> log AND prevLog.date <= log.date
WITH log, prevLog ORDER BY prevLog.date DESC LIMIT 1
FOREACH (_ IN CASE WHEN prevLog IS NOT NULL THEN [1] ELSE [] END |
CREATE (log)-[:FOLLOWS]->(prevLog)
)
RETURN log.date AS 日付, log.situation AS 状況
パラメータ:
$clientName: クライアント名$supporterName: 支援者名(不明の場合は "不明")$date: 日付(YYYY-MM-DD形式、不明なら今日の日付)$situation, $action, $effectiveness, $note$type: 記録種別(日常記録 / インシデント / 会議 / 引き継ぎ、デフォルト: 日常記録)$duration: 対応にかかった時間(例: "30分"、任意)$nextAction: 次回のアクション(任意)クライアント配下のノードとしてリレーションごと MERGE する(再実行で重複せず、他クライアントとノードを共有しない)。
MATCH (c:Client {name: $clientName})
MERGE (c)-[:MUST_AVOID]->(ng:NgAction {action: $action})
ON CREATE SET ng.reason = $reason, ng.riskLevel = $riskLevel
ON MATCH SET ng.reason = COALESCE($reason, ng.reason),
ng.riskLevel = COALESCE($riskLevel, ng.riskLevel)
RETURN ng.action AS 禁忌事項, ng.riskLevel AS リスクレベル
パラメータ: $clientName(完全一致), $action, $reason, $riskLevel (LifeThreatening / Panic / Discomfort)
MATCH (c:Client {name: $clientName})
MERGE (c)-[:REQUIRES]->(cp:CarePreference {category: $category, instruction: $instruction})
ON CREATE SET cp.priority = $priority
ON MATCH SET cp.priority = COALESCE($priority, cp.priority)
RETURN cp.category AS カテゴリ, cp.instruction AS 手順
パラメータ: $clientName(完全一致), $category, $instruction, $priority (High / Medium / Low)
MATCH (c:Client {name: $clientName})
MERGE (c)-[r:HAS_KEY_PERSON]->(kp:KeyPerson {name: $name})
SET kp.relationship = COALESCE($relationship, kp.relationship),
kp.phone = COALESCE($phone, kp.phone),
kp.role = COALESCE($role, kp.role),
r.rank = COALESCE($rank, r.rank)
RETURN kp.name AS 名前, kp.relationship AS 続柄
パラメータ: $clientName(完全一致), $name, $relationship, $phone, $role, $rank(優先順位番号)
手帳種別(type)ごとにクライアント1人1ノード。更新時は同じノードの等級・更新期限を上書きする。
発行日・状態はスキーマ規約どおりリレーション側(HAS_CERTIFICATE {issuedDate, status})に持つ。
MATCH (c:Client {name: $clientName})
MERGE (c)-[r:HAS_CERTIFICATE]->(cert:Certificate {type: $type})
SET cert.grade = COALESCE($grade, cert.grade),
cert.nextRenewalDate = CASE WHEN $nextRenewalDate IS NOT NULL
THEN date($nextRenewalDate) ELSE cert.nextRenewalDate END,
r.issuedDate = CASE WHEN $issuedDate IS NOT NULL
THEN date($issuedDate) ELSE r.issuedDate END,
r.status = COALESCE($status, r.status, 'Active')
RETURN cert.type AS 種類, cert.grade AS 等級, cert.nextRenewalDate AS 更新日
パラメータ: $clientName(完全一致), $type, $grade, $nextRenewalDate, $issuedDate(任意・nullで省略可), $status(任意・nullで省略可)
データ変更時には必ず監査ログを残す。
CREATE (al:AuditLog {
timestamp: datetime(),
user: $user,
action: $action,
targetType: $targetType,
targetName: $targetName,
details: $details,
clientName: $clientName
})
WITH al
OPTIONAL MATCH (c:Client {name: $clientName})
WHERE $clientName <> ''
FOREACH (_ IN CASE WHEN c IS NOT NULL THEN [1] ELSE [] END |
CREATE (al)-[:AUDIT_FOR]->(c)
)
RETURN al.timestamp AS 記録日時
パラメータ: $user(操作者名), $action(例: "CREATE", "UPDATE"), $targetType(例: "SupportLog", "NgAction"), $targetName(内容の要約), $details(詳細), $clientName
キーワードで支援記録を横断検索する。全文検索インデックス idx_supportlog_fulltext を使用。
CALL db.index.fulltext.queryNodes('idx_supportlog_fulltext', $keyword)
YIELD node, score
MATCH (s:Supporter)-[:LOGGED]->(node)-[:ABOUT]->(c:Client)
WHERE $clientName = '' OR c.name CONTAINS $clientName
RETURN node.date AS 日付,
s.name AS 支援者,
c.name AS クライアント,
node.situation AS 状況,
node.action AS 対応,
node.effectiveness AS 効果,
score AS スコア
ORDER BY score DESC
LIMIT $limit
パラメータ: $keyword(検索語), $clientName(空文字で全員), $limit(デフォルト20)
注意: Neo4jの全文検索はデフォルトで英語アナライザーを使用するため、日本語の形態素解析には制限があります。単語単位の検索(例: "パニック")には有効ですが、複合語の場合は CONTAINS との併用を推奨します。
FOLLOWS リレーションで支援記録の時系列を辿り、ケアの変遷を追跡する。
MATCH (log:SupportLog)-[:ABOUT]->(c:Client)
WHERE c.name CONTAINS $clientName
OPTIONAL MATCH path = (log)-[:FOLLOWS*0..10]->(older:SupportLog)
WITH c, log, older, length(path) AS depth
ORDER BY log.date DESC, depth ASC
RETURN log.date AS 日付,
log.situation AS 状況,
log.action AS 対応,
log.effectiveness AS 効果,
log.type AS 種別,
depth AS チェーン深度
LIMIT $limit
パラメータ: $clientName, $limit(デフォルト30)
PDFやExcelのレポート生成が必要な場合は、以下の別スキルを使用する:
| 出力形式 | 使用スキル | 内容 |
|----------|-----------|------|
| PDF | pdf スキル | 緊急時情報シート(A4 1枚) |
| Excel | xlsx スキル | 詳細データシート(全データ) |
手順: まずこのスキルのテンプレート2(プロフィール一括取得)でデータを取得し、PDFまたはExcelスキルに渡して整形する。
「パニック」「事故」「急病」「緊急」などのワードを検知したら、このスキルではなく emergency-protocol スキルを即座に起動すること。
生年月日(dob)が取得できた場合、必ず現在の年齢を計算して併記する。
例: 1995-03-15 → 1995-03-15(30歳)
クライアント情報を表示する際、NgAction(禁忌事項)が存在する場合は 最初に強調表示 すること。
ユーザーから支援記録テキストを受け取った場合:
EffectiveIneffectiveNeutralデータの新規登録や更新を行う前に、登録内容をユーザーに確認すること。特に:
すべてのクエリで $param 形式のパラメータを使用すること。文字列連結によるCypher構築は禁止(インジェクション対策)。
具体的な操作手順の例(新規支援計画作成・支援記録追加・効果的ケア振り返り・更新期限管理・ クライアント未発見時)は付録に分離した。必要なときに参照すること: reference/use-cases.md
| スキル | 連携タイミング |
|--------|---------------|
| emergency-protocol | 緊急ワード検知時に即座に切り替え |
| ecomap-generator | 支援ネットワーク図の生成 |
| provider-search | 事業所検索・利用状況の確認 |
| pdf / xlsx | レポート出力時 |
このデータベースは単なる情報管理ツールではなく、クライアントの権利擁護のための ツールである(尊厳・安全・継続性・権利擁護の基本原則)。詳細は reference/use-cases.md を参照。
tools
⚠️【非運用 / DECOMMISSIONED 2026-05】この生活困窮者自立支援スキルは廃止され、運用していません。決して使用・発火しないでください。対応する Neo4j(port 7688)・MCP サーバー(livelihood-support-db)も撤去済みで、クエリは通りません。ユーザーが生活困窮支援を明示的に要求した場合は、本機能が非運用である旨を伝えてください。
tools
WAM NET(障害福祉サービス等情報公表システム)からオープンデータを取得し、Neo4j親なき後支援データベースのServiceProviderノードを同期するスキル。差分更新、廃止事業所検出、更新レポート生成機能を提供。
tools
訪問・同行支援の前に、クライアントの禁忌事項・推奨ケア・直近の支援記録・更新期限を自動収集し、簡潔なブリーフィングシートを生成するスキル。「訪問準備」「訪問前に確認」「明日〇〇さんのところに行く」「同行支援の注意点」「ブリーフィング」などの発言時に必ずこのスキルを使用すること。訪問や面談の予定がある場合にも積極的に使用する。
testing
「もし親が倒れたら」をシミュレーションし、親が担っている機能(CareRole)の代替手段カバー率を診断するスキル。マニフェスト第5の柱「親の機能移行(Parental Transition)」を中核とし、未カバーのタスクに対する福祉サービス候補の検索も行う。「レジリエンス」「親なき後」「もしもの時」「親が倒れたら」「カバー率」「バックアップ体制」「機能移行」「親の入院」「親が認知症」などの話題で必ずこのスキルを使用すること。parent_downプロトコル発動時にも使用する。