mcpField
C
contacts

contacts

github.com/joelhooks生産性653.3k 回インストール1 日前に更新
リポジトリ

contacts について

contactsは、ローカルのVaultで連絡先をMarkdownファイルとして管理するスキルです。手動作成とインデックス済み情報源からの補完に対応し、VIP向けの詳細な情報収集とモニタリング手順も備えています。

主な機能

  1. 01Markdownファイルで連絡先を保存
  2. 02別名、役職、組織の記録
  3. 03インデックス済み情報源から情報を補完
  4. 04連絡先ノートの作成と更新
  5. 05VIP向け詳細情報収集の指定

活用シーン

  1. 01既知の識別情報を使った連絡先の追加
  2. 02既存の連絡先記録の更新
  3. 03Vaultノートをリンクした連絡先の整理

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/joelhooks/joelclaw --skill contacts

インストール後、Claude Code で/contactsを入力して読み込まれたか確認します。

詳細

連絡先

~/Vault/Contacts/ で連絡先を管理します。各連絡先は YAML フロントマターを含む Markdown ファイルです。

連絡先ファイルの場所

~/Vault/Contacts/<Name>.md

インデックスファイル:~/Vault/Contacts/index.md — すべての連絡先を列挙した Wikilink リストです。

フロントマターのスキーマ

---
name: Full Name
aliases: [nickname, handle]
role: Current Role / Title
organizations: [Org1, Org2]
vip: true  # or false
slack_user_id: U0XXXXXXX
slack_dm_channel: D0XXXXXXX  # null if unknown
website: https://example.com
github: username
twitter: handle
email: [email protected]
tags: [vip, instructor, creator, family, employee]
---

セクション

# Name

## Contact Channels
- Slack, email, social handles, website

## Projects
- Active projects, courses, collaborations

## Key Context
- Relationship notes, working style, history

## Recent Activity
- YYYY-MM-DD | channel | summary

内容を充実させた例については、~/Vault/Contacts/Matt Pocock.md を参照してください。

連絡先の追加

オプション 1:エンリッチメントパイプラインを実行する(推奨)

Inngest イベントを送信します。contact-enrich 関数は Slack、Roam、ウェブ/GitHub、Granola、Brain によるリコール、その他のインデックス化されたソースを並行して処理し、LLM で統合して Vault ファイルに書き込みます。

# Via curl (CLI has OTEL import bug under Bun v1.3.9)
curl -s -X POST "http://localhost:8288/e/$INNGEST_EVENT_KEY" \
  -H "Content-Type: application/json" \
  -d '[{
    "name": "contact/enrich.requested",
    "data": {
      "name": "Person Name",
      "depth": "full",
      "hints": {
        "slack_user_id": "U0XXXXXXX",
        "github": "username",
        "twitter": "handle",
        "email": "[email protected]",
        "website": "https://example.com"
      }
    },
    "ts": EPOCH_MS
  }]'

深度モード:

  • full(約60秒、約$0.05):7つすべてのソースと LLM による統合。新しい連絡先や定期的な更新に使用します。
  • quick(約10秒、約$0.01):Slack とメモリーのみ。VIP のリアルタイム検出に適しています。

ヒントは任意ですが、役立ちます: 既知の識別情報(Slack ID、GitHub、メールアドレス、Twitter、ウェブサイト)があれば、検索の手がかりとなり、結果の精度が上がります。

オプション 2:簡単な手動作成

エンリッチメントが過剰な簡単な連絡先の場合:

---
name: Person Name
aliases: []
role: Role
organizations: [Org]
vip: false
slack_user_id: null
website: null
github: null
twitter: null
email: null
tags: [tag1]
---

# Person Name

## Contact Channels
- ...

## Key Context
- ...

~/Vault/Contacts/Person Name.md に書き込み、index.md に [[Person Name]] を追加します。

連絡先の更新

既存の Vault パスを指定して、エンリッチメントを再実行します。

{
  "name": "contact/enrich.requested",
  "data": {
    "name": "Person Name",
    "vault_path": "Contacts/Person Name.md",
    "depth": "full"
  }
}

統合処理では新しいデータと既存の内容をマージします。既存の事実が矛盾する情報によって否定されない限り、削除されることはありません。

VIP 連絡先(ADR-0151)

フロントマターで vip: true に設定します。VIP には詳細なエンリッチメントと継続的なモニタリングが適用されます。

詳細エンリッチメントの手順(初回のみ)

すべての VIP に対して、徹底的な処理を行います。2026年2月26日に Kent C. Dodds に対して実施した内容は次のとおりです。

ステップソース収集する内容
1. ウェブ上の情報ウェブ検索 {name} + {org}経歴、役職、所在地、個人情報
2. ポッドキャスト/インタビューウェブ検索 {name} podcast interview出演一覧、自身のポッドキャスト、対象視聴者
3. Joel との共同活動本人のウェブサイト、出演ページ共同ポッドキャスト、共同開催イベント、共有プロジェクト
4. 経歴のタイムライン重要なインタビューの書き起こしを2〜3件 Defuddle で処理原点となるストーリー、キャリアの歩み、重要な決断、価値観
5. GitHub プロフィールGitHub API またはウェブリポジトリ、フォロワー、組織、コントリビューションの傾向
6. X/Twitter プロフィールX API v2(x-api スキルを使用)自己紹介、フォロワー、最近のツイート、エンゲージメント
7. 主要な人間関係書き起こしと連絡先を相互参照一緒に仕事をする相手、言及する相手、共通の知人
8. コンテンツ一覧ウェブサイトをクロール(Defuddle)コース、ブログ記事、オープンソースプロジェクト
9. オーディエンスへのリーチポッドキャストの件数、ソーシャルメディアのフォロワー数講演活動、コミュニティでの存在感

エンリッチメント後、Typesense にインデックスを作成します。

  • 出演・コンテンツを discoveries コレクションに一括インポートします(NDJSON、action=upsert)。
  • フィルタリング用に、すべてのドキュメントに人物名のスラッグ(例:kent-c-dodds)をタグ付けします。
  • フィールド:id、title、url、summary、tags[]、timestamp
  • Vault/Resources/{name}-media-appearances.md に参照ドキュメントを作成し、連絡先へのリンクを記載します。

Vault のノートに含めるセクション:

  • 背景とストーリー(原点、キャリアのタイムライン)
  • 教育/仕事の哲学(教育者でない場合は、それに相当する内容)
  • 主要な人間関係(他の連絡先への [[wikilinks]] による相互リンク)
  • オーディエンスとリーチ
  • コンテンツ/製品
  • Joel とのポッドキャスト/共同活動の履歴
  • 最近の活動(タイムスタンプ付き)
継続的なモニタリング(ADR-0151 のフェーズ2〜4)
チャネルツールシグナル
Google Alertsjoelclawbot の Google アカウントニュース、ブログ、報道での名前の言及
X/Twitter リストjoelclaw の X アカウントツイート、エンゲージメント
GitHub の活動GitHub API(ポーリング)新しいリポジトリ、リリース
ポッドキャスト RSSフィードのモニタリング新しいエピソード
ウェブサイトの変更Defuddle と差分の定期実行ブログ記事、公開情報、経歴の変更

シグナルの高い情報(即時):コースの公開、役職の変更、Joel/egghead/Skill への言及、資金調達。 シグナルの低い情報(毎日/毎週のダイジェスト):通常のツイート、ブログ記事、OSS の活動。

現在のVIP
  • エンリッチメント後、ゲートウェイ経由でJoelに通知されます
  • スケジュールされたcronにより、毎週更新されます
  • チャネルインテリジェンスパイプラインで優先されます(ADR-0131、ADR-0132)
  • ADR-0151のフェーズ2以降が実装されると、継続的なモニタリングが行われます

Roam Researchによるエンリッチメント

JoelのRoamアーカイブ(~/Code/joelhooks/egghead-roam-research/)には、egghead時代のグラフ全体(2019~2024年)が含まれています。多くの連絡先について、詳細な履歴が記録されています。

クイック検索(Python正規表現)
cd ~/Code/joelhooks/egghead-roam-research
python3 -c "
import re
with open('egghead-2026-01-19-13-09-38.edn', 'r') as f:
    content = f.read()
pattern = r':block/string\s+\"([^\"]*?)\"'
matches = []
for m in re.findall(pattern, content):
    if '[[SEARCH_TAG]]' in m.lower():
        matches.append(m)
print(f'Found {len(matches)} blocks')
for m in matches[:30]:
    print(f'  - {m[:200]}')
"
人物の分類

Roamでは、人々に関係性を示すプレフィックスがタグ付けされています。

  • [[collaborator/Name]] — 戦略的パートナー(Ian Jones、Alex Hillman)
  • [[client/Name]] — eggheadのインストラクター(Matt Pocock、Jacob Paris)
  • [[staff/Name]] — eggheadのチームメンバー(Will Johnson、Daniel Miller、Maggie Appleton)
  • [[name]](プレフィックスなし)— 非公式な言及(Zacは[[zac]])
ページタイトルの検索
python3 -c "
import re
with open('egghead-2026-01-19-13-09-38.edn', 'r') as f:
    content = f.read()
pattern = r':node/title\s+\"([^\"]*?SEARCH_TERM[^\"]*?)\"'
for m in re.findall(pattern, content):
    print(f'  page: {m}')
"
連絡先への追加

Roamから人物データを抽出する際は、フロントマターにroam_tagを追加します。

roam_tag: "[[collaborator/Ian Jones]]"

これにより、今後の再クエリと相互参照が可能になります。

Datalogクエリ(上級者向け)

EDNファイルはDatomic形式です。構造化分析用のClojureスクリプトは scripts/にあります。Datalogパターンの全容については、roam-researchスキルを参照してください。

不明な人物の特定

SlackユーザーID(<@U0XXXXXXX>)を見つけた場合:

# Lease token and look up profile
SLACK_USER=$(secrets lease slack_user_token --ttl 5m)
curl -s "https://slack.com/api/users.info?user=U0XXXXXXX" \
  -H "Authorization: Bearer $SLACK_USER" | jq '.user.real_name, .user.profile.email'
# Revoke only the exact lease ids acquired by this task; never all sessions’ leases.

次に、特定した名前とヒントを使ってエンリッチメントを実行します。

Inngest関数

  • 関数:contact-enrich(packages/system-bus/src/inngest/functions/contact-enrich.ts)
  • イベント:contact/enrich.requested
  • ADR:~/Vault/docs/decisions/0133-contact-enrichment-pipeline.md
  • 同時実行数:最大3件
  • ソース:Slack、Slack Connect、Roamアーカイブ、GitHub/ウェブ、Granolaの会議、Brainに基づく想起、その他のインデックス済みソース

プライバシー

  • 連絡先ファイルはVaultに保存されています(非公開で、公開リポジトリにはありません)
  • Slackデータは非公開のままにし、公開コンテンツには決して掲載しません
  • メールアドレスと電話番号はJoelの参照用にのみ保存されます

コメント