nope-mcp — Open Educational Resources search について
nope-mcpは、AMBのNostrリレー上で教育リソースを検索・公開するMCPサーバーです。複数コンテンツの検索に加え、メタデータ抽出やNostrイベントの署名にも対応します。
主な機能
- 01複数コンテンツの検索と絞り込み
- 02質問に基づく引用付き文章検索
- 03分野や教育段階の閲覧
- 04URLから教育メタデータを抽出
- 05Nostrイベントの署名と公開
活用シーン
- 01オープンライセンスの教材を探す
- 02質問に関連する根拠箇所を取得する
- 03Webページを教育メタデータに変換する
- 04AMB教育リソースを公開する
MCP 対応
検索、閲覧、リソース取得、メタデータ抽出、Nostr署名のツールをMCPクライアントに提供します。HTTP、stdio、Nostrの各トランスポートで利用できるツールが異なります。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://mcp.edufeed.org/mcpclaude mcp add --transport http org-edufeed-nope https://mcp.edufeed.org/mcp{"mcpServers":{"org-edufeed-nope":{"type":"http","url":"https://mcp.edufeed.org/mcp"}}}Cursor で開く{"servers":{"org-edufeed-nope":{"type":"http","url":"https://mcp.edufeed.org/mcp"}}}VS Code で開く{"mcpServers":{"org-edufeed-nope":{"type":"http","url":"https://mcp.edufeed.org/mcp"}}}{"mcpServers":{"org-edufeed-nope":{"serverUrl":"https://mcp.edufeed.org/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
18| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| limit | number | いいえ | 結果の最大件数(1~250、デフォルト:20) |
| query | string | いいえ | フリーテキスト検索クエリ(例:"mathematik"、"machine learning") |
| since | number | いいえ | この Unix タイムスタンプ以降に作成されたリソースを返します |
| until | number | いいえ | この Unix タイムスタンプ以前に作成されたリソースを返します |
| relays | array | いいえ | 検索対象を特定のリレーに限定します。list_relays が返すリレー(デフォルトまたは追加)のみ指定できます。完全な URL または短縮名(例:"oersi"、"sodix")で指定します。デフォルト:デフォルトのリレーセット。 |
| authors | array | いいえ | 作者の公開鍵で絞り込みます(16 進数形式)。 |
| language | string | いいえ | ラベルフィルターに使用する言語(デフォルト:"de") |
| creatorName | string | いいえ | 作成者/作者名で絞り込みます。AMB メタデータとの大文字小文字を区別しない完全一致です。綴りが不確かな場合は、先に resolve_publisher を呼び出してください。 |
| subjectLabel | string | いいえ | 教科/トピックラベルで絞り込みます。ラベルの完全一致が必要です(例:"Mathematik"、"Physik")。有効なラベルは browse_subjects で確認できます |
| publisherName | string | いいえ | 公開者名で絞り込みます。AMB メタデータとの大文字小文字を区別しない完全一致です。例:"e-teaching.org"、"LEHRE LADEN"("Lehreladen" ではありません)。綴りが不確かな場合は、先に resolve_publisher を呼び出してください。 |
| resourceTypeLabel | string | いいえ | リソースタイプラベルで絞り込みます。ラベルの完全一致が必要です(例:"Video"、"Kurs"、"Arbeitsblatt")。有効なラベルは browse_resource_types で確認できます |
| educationalLevelLabel | string | いいえ | 教育段階で絞り込みます。ラベルの完全一致が必要です(例:"Sekundarstufe I"、"Hochschule")。有効なラベルは browse_educational_levels で確認できます |
詳細
nope-mcp(旧 amb-mcp)
AMB(Allgemeines Metadatenprofil für Bildungsressourcen)Nostr リレーから教育リソースを検索する MCP(Model Context Protocol)サーバーです。
リポジトリ
正規リポジトリは Nostr 上にあります(NIP-34)。gitworkshop.devで閲覧するか、ngitリモートヘルパーを使ってクローンできます。
git clone nostr://laoc.xyz/relay.ngit.dev/amb-mcp
ミラー:git.edufeed.org/edufeed/nope-mcp · github.com/edufeed-org/nope-mcp。3つのいずれでも、イシューや PR を歓迎します。Nostr の PR は pr/* ブランチとして届きます。
リリースにはタグ(v0.1.0、…)が付けられ、CHANGELOG.mdに記載されています。
MCP レジストリ
server.jsonは、nope-mcp が公式 MCP
レジストリにorg.edufeed/nope-mcpとして公開するマニフェストで、https://mcp.edufeed.org/mcpリモートを参照します。そのversionは常にpackage.jsonと一致します(test/server-json.test.tsで検証されます)。
公開には、edufeed.orgの DNS ベースのドメイン認証後、レジストリのmcp-publisher
CLI を使用します(レジストリは、CLI が保持する秘密情報ではなく TXT レコードを使ってorg.edufeed名前空間の所有権を確認します)。管理するキーはなく、キーを埋め込むコマンドもありません。
機能
検索と閲覧
- 教育リソース、長文記事、Wiki、transferkiosk プロジェクト/施策、NKBIP-01 科学出版物を対象としたコンテンツ横断の全文検索(
search_content)を、1回のランキング付き呼び出しで実行 - 根拠となる箇所の検索(
search_passages)。コーパスの全文から、引用を添えて質問に回答します。grimoire スペル(kind 777)またはインラインスコープで範囲を指定します。インデクサーが必要です - リレーで再ランキングが有効な場合、チャンクの再ランキングから得られたセマンティックな抜粋箇所を結果ごとに表示
- NIP-50 による全文検索
- 発行者、作成者、主題、リソースの種類、教育段階で絞り込み
- 利用可能な主題、リソースの種類、教育段階を閲覧
- 作成者/組織名を公開鍵に解決(
resolve_author)し、作成者を指定したクエリに利用 - 時刻、ジオハッシュ、ハッシュタグで絞り込める NIP-52 カレンダーイベント検索
- SKOS 管理語彙の参照と検索(
skos_*) - 識別子で個々のリソースを取得
- リレーの統計情報と情報を取得
URL → フォーム事前入力メタデータ
extract_metadata(url, variant, skosSchemes?)— 公開ウェブページを取得し、AMB/EKW フォームの完全な事前入力用ペイロードを生成します。デフォルトでは OpenGraph のフォールバックを返します。ANTHROPIC_API_KEYが設定されている場合、設定された SKOS 語彙に基づく LLM が、概念 ID とフィールドごとの根拠となる引用を使って、SKOS 型フィールドを入力します。- ライブラリのエクスポート:
import { extractMetadata } from 'nope-mcp/lib'で直接プロセス内から利用できます(例:SvelteKit のサーバールート)。
署名と公開
- QR コード接続フローを備えた NIP-46 リモート署名(bunker)
- 任意の Nostr イベントに署名して公開
- kind 0(プロフィール/メタデータ)イベントを作成して公開
- kind 30142(AMB 教育リソース)イベントを作成して公開
- NIP-42 リレー認証に対応
- 複数ユーザーのセッションを分離
インストール
bun install
設定
.env.exampleを.envにコピーして設定します。
cp .env.example .env
環境変数
| 名前 | 使用対象 | デフォルト | 説明 |
|---|---|---|---|
AMB_RELAYS | すべてのトランスポート | wss://relay.edufeed.org | カンマ区切りの AMB リレー URL です。すべてのコンテンツツール(search_content、search_resources、get_resource、browse_*、resolve_author、relay_stats)で照会され、署名ツールのデフォルトの公開先として使用されます。 |
AMB_EXTRA_RELAYS | すべてのトランスポート | (空) | カンマ区切りの AMB リレー URL です。選択可能ですが、デフォルトでは検索されません。search_content、search_resources、get_resource は、AMB_RELAYS ∪ AMB_EXTRA_RELAYS に含まれるリレーを指定する relays パラメーターを受け付けます(それ以外は拒否されます)。list_relays は両方のグループを defaultRelays/extraRelays として通知します。これを使うと、すべての検索対象に含めることなく、リクエストに応じて代替コーパス(例:OERSI および SODIX の集約リレー、wss://oersi.edufeed.org,wss://sodix.edufeed.org)を公開できます。HTTP では、このリストは ?relays= コネクターのパラメーターにも使用されます。コネクターのデフォルトリレーを選択するを参照してください。 |
AMB_AUTHOR_SETS | すべてのトランスポート | (空) | NIP-51 フォローセット(kind 30000)の naddr 識別子をカンマ区切りで指定します。起動時に一度読み込まれ、list_known_authors が提供する著者ディレクトリに追加されます。返された公開鍵は、authors として search_* ツールに渡せます。 |
CALENDAR_RELAYS | すべてのトランスポート | wss://relay.edufeed.org | search_calendar_events 用の NIP-52 カレンダーリレー URL をカンマ区切りで指定します。AMB リレー自体がカレンダーイベントを提供するため、デフォルトは同じリレーです。専用のカレンダーリレーを使用する分割デプロイの場合にのみ設定してください。 |
CALENDAR_AUTHOR_SETS | すべてのトランスポート | (空) | list_calendar_authors が提供するカレンダー著者ディレクトリ向けの設定です。AMB_AUTHOR_SETS と同じです。 |
INDEXER_ENDPOINTS | search_passages | (未設定 — ツール無効) | 各 AMB リレーを amb-indexer のベース URL に対応付ける、カンマ区切りの wss://relay=https://indexer ペアです。search_passages を有効にします。 |
INDEXER_API_TOKEN | search_passages | (未設定) | インデクサーの /search_chunks 用ベアラートークンです(すべてのエンドポイントで共通のデフォルト値)。 |
INDEXER_API_TOKENS | search_passages | (未設定) | リレーごとのトークンの上書き値です。カンマ区切りの wss://relay=token ペアで指定します。デプロイされた各インデクサーインスタンスには、それぞれ独自のトークンがあります。すべての INDEXER_ENDPOINTS エントリーに、この設定または INDEXER_API_TOKEN でトークンを割り当てる必要があります。トークンが一部にしか設定されていない構成では、起動時にエラーになります。 |
OPEN_LICENSES_ONLY | すべてのトランスポート | true | 検索結果(search_resources、search_content、search_passages)には、オープンライセンスの学習リソース(CC0、Public Domain Mark、CC BY、CC BY-SA)のみが含まれます。他のコンテンツ種別にはライセンスがなく、常に含まれます。get_resource はフィルタリングされず、openLicense を報告します。false(または 0/no/off)にすると、すべてのリソースが返されます。 |
SPELL_RELAYS | search_passages | wss://relay.edufeed.org | kind-777 のスペル(および kind-3 の連絡先リスト)を取得するリレーです。 |
LOG_LEVEL | すべてのトランスポート | info | ツール呼び出しごとのログを stderr に出力します(stdout は stdio トランスポート用です)。各呼び出しで 1 行の JSON が出力されます:{"ts":"2026-09-14T12:00:00.000Z","tool":"search_passages","ms":412,"ok":true,"session":"<id>","args":{"question":"…","kinds":[30142]}} — isError の結果、スローされたエラー、JSON 本文に error コード(relay_unreachable などの型付きエラー)が含まれるテキスト結果では、ok は false になります。この場合、error にはメッセージまたはコードが入ります。args 内の文字列は 120 文字で切り詰められ、5 個を超える配列は {length, head} にまとめられます。デフォルトの info はすべての呼び出しを記録し、warn/error は失敗のみを記録し、silent はログを無効にします。 |
EDUFEED_APP_BASE_URL | すべてのトランスポート | (未設定) | フロントエンドのベース URL です(末尾のスラッシュなし。例:https://app.edufeed.org)。設定すると、search_content、search_resources、get_resource、search_calendar_events の結果に、edufeed-app のビューアーページ(<base>/<naddr>)を指す url フィールドが含まれ、LLM クライアントが直接リンクを表示できるようになります。未設定の場合、url フィールドは含まれません。 |
SERVER_PRIVATE_KEY | src/index.ts(および検出スクリプト) | Nostr トランスポートでは 必須 | サーバー自身の ContextVM アイデンティティとなる Nostr 秘密鍵(nsec または hex)です。導出された公開鍵を使って、クライアントは cvmi use <pubkey> 経由で接続します。stdio トランスポートおよび HTTP トランスポートでは読み込まれません。 |
RELAYS | src/index.ts(および検出スクリプト) | wss://relay.contextvm.org、wss://cvm.otherstuff.ai | ContextVM トランスポートの通知およびリクエスト/レスポンスの通信に使用するリレー URL をカンマ区切りで指定します。stdio トランスポートおよび HTTP トランスポートでは読み込まれません。 |
ANTHROPIC_API_KEY | extract_metadata | (未設定) | LLM に基づく SKOS フィールド抽出を有効にします。未設定の場合、ツールは OpenGraph/JSON-LD のみの出力に適切にフォールバックします。 |
ANTHROPIC_MODEL | extract_metadata | claude-sonnet-4-6 | 抽出に使用する Anthropic モデルを上書きします。 |
SKOS_SCHEMES | extract_metadata | (未設定) | 呼び出し元が skosSchemes を明示的に渡さない場合に使用する、デフォルトの語彙を指定する JSON マップ { "<form-field>": "<scheme-uri>" } です。 |
VOCAB_RELAYS | extract_metadata | AMB_RELAYS にフォールバック | naddr1… の SKOS スキーム識別子を、リレー上でホストされている語彙に解決するために使用するリレーです。 |
SCHEME_NADDR_* | extract_metadata | (未設定) | スキーム URI を、リレー上でホストされている SKOS 語彙に対応付ける、語彙ごとの naddr 上書き値です(例:SCHEME_NADDR_HCRT、SCHEME_NADDR_SCHULFAECHER)。一覧については .env.example を参照してください。 |
HTTP_*、OAUTH_* | src/http.ts のみ | 下記を参照 | HTTP のバインド設定および OAuth リソースサーバー設定です。オプション 4に記載されています。 |
EMBED_TOKEN | docker-compose.yml のみ | (未設定) | 同梱のローカルテストリレーで使用する埋め込みサービス用トークンです。サーバー自体では読み込まれません。 |
使用方法
オプション 1:Claude Code に追加する(推奨)
claude mcp add nope-mcp -- bun run /path/to/nope-mcp/src/stdio.ts
デフォルトの公開リレー(wss://relay.edufeed.org)を使用します。別のリレーを指定する場合(例:開発に記載されているローカル Docker リレー)、-e AMB_RELAYS=ws://localhost:3337 を追加してください。
オプション 2:cvmi(ContextVM)で実行する
サーバーを起動します:
cvmi serve -- bun run src/stdio.ts
別のマシンから接続します:
cvmi use <server-pubkey>
オプション 3:Nostr トランスポートでスタンドアロン実行する
bun run src/index.ts
オプション 4:Streamable HTTP トランスポートで実行する
Web ベースの MCP クライアント(Claude.ai コネクター、MCP Inspector、カスタムブラウザーアプリ)向け:
bun run src/http.ts # dev
node dist/http.js # production (after `npm run build`)
| 変数 | デフォルト値 | 説明 |
|---|---|---|
HTTP_PORT | 3000 | バインドするポートです。 |
HTTP_HOST | 0.0.0.0 | バインドするホストです。ローカルプロキシに限定するには 127.0.0.1 を使用します。 |
HTTP_ALLOWED_HOSTS | (未設定) | カンマ区切りの Host 許可リストです。設定すると、DNS リバインディング保護が有効になります。 |
HTTP_ALLOWED_ORIGINS | (未設定) | カンマ区切りの Origin 許可リストです。 |
OAUTH_ISSUER | https://auth.edufeed.org/realms/edufeed | トークンを受け付ける OIDC 発行者です。 |
OAUTH_AUDIENCE | nope-mcp,amb-mcp | カンマ区切りの受け付ける audience です。トークンの aud にいずれかが含まれていれば有効です。 |
OAUTH_JWKS_URI | <issuer>/protocol/openid-connect/certs | トークン署名を検証する JWKS エンドポイントです。 |
OAUTH_RESOURCE_URL | https://mcp.amb.edufeed.org/mcp | HTTP_ALLOWED_HOSTS にないホストに対するフォールバック PRM リソースです。それ以外の場合、リソースはリクエストごとに導出されます(RFC 9728):/.well-known/oauth-protected-resource → https://<host>/、/.well-known/oauth-protected-resource/mcp → https://<host>/mcp。 |
認証モデル: HTTP トランスポートは OAuth 2.0 リソースサーバーです。
Authorizationヘッダーなしのリクエストには、匿名の読み取り専用セッション(mcp:read)が割り当てられます:検索、取得、閲覧、解決、SKOS ルックアップ。- 有効な JWT(
OAUTH_ISSUERが発行し、OAUTH_AUDIENCEの audience のいずれかを対象とするもの)を含むリクエストには、トークンのスコープ(mcp:readおよび/または予算を消費するextract_metadataツールのmcp:extract)が付与されます。無効なトークンは 401 で拒否されます。 - 書き込み/署名ツールは HTTP では公開されません。これらは stdio および Nostr トランスポートでのみ利用できます。スコープが不足している場合、そのツールは
tools/listに表示されません。
サーバーが公開するエンドポイント:
POST /およびPOST /mcp— JSON-RPC リクエスト(initialize、ツール呼び出しなど)。同じセッションマップを使用します。GET /およびGET /mcp— 現在のセッション向けのサーバープッシュ SSE ストリームGET /(通常のブラウザーリクエスト —Mcp-Session-Idなし、Accept: text/event-streamなし)— MCP 404 の代わりに、小さな JSON 情報ドキュメント(name、version、mcp、docs、transport)を返します。
GET /mcpは常に MCP セッションリクエストとして動作します。DELETE /およびDELETE /mcp— 現在のセッションを終了します。GET /.well-known/oauth-protected-resource/GET /.well-known/oauth-protected-resource/mcp— それぞれ/と/mcpに対応する RFC 9728 保護リソースメタデータ。ホストを考慮します。GET /healthz— 認証不要の稼働確認プローブ
curl を使ったハンドシェイクの例:
# 1. initialize (anonymous = read-only session), capture the Mcp-Session-Id response header
curl -i http://localhost:3000/mcp -X POST \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'
# 2. reuse the session id for tools/list, tools/call, etc.
curl http://localhost:3000/mcp -X POST \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H 'Mcp-Session-Id: <id-from-step-1>' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'
# To use extract_metadata, add an OAuth token to the *initialize* request:
# -H "Authorization: Bearer $ACCESS_TOKEN"
# (scopes are fixed at session init; a token on later requests does not upgrade the session)
MCP Inspector でスモークテストを実行します:
npx @modelcontextprotocol/inspector http://localhost:3000/mcp
コネクターのデフォルトリレーを選択する
ほとんどのコネクターの UI(たとえば Claude.ai の「カスタムコネクターを追加」)には、名前と URL の 2 つのフィールドがあります。そのため、URL で接続がデフォルトで検索するリレーを指定します。
https://mcp.edufeed.org/mcp?relays=sodix
https://mcp.edufeed.org/mcp?relays=amb-relay,sodix,oersi
(以前のホスト https://mcp.amb.edufeed.org/mcp も引き続き変更なく動作します。どちらも同じ ?relays= 構文を受け付けます。)
?relays= で指定したリレーは、そのセッションのデフォルトセットとなり、search_content / search_resources の呼び出しごとに検索されます。デプロイメントが提供するほかのすべてのリレーは追加セットに含まれます。list_relays では引き続き通知され、ツール呼び出しでは独自の relays パラメーターを使ってアクセスできます。このパラメーターを指定しない場合、セッションは従来どおりサーバーで設定されたデフォルトセットを使用します。
名前は、デプロイメントがすでに提供しているリレー(AMB_RELAYS ∪ AMB_EXTRA_RELAYS)に照合されます。各リレーは次の 3 つの形式で指定できます。
| 形式 | 例 |
|---|---|
| 完全な URL | wss://sodix.edufeed.org |
| ホスト名 | sodix.edufeed.org |
| ホスト名の最初のラベル | sodix |
短縮ラベルが 2 つのリレーで重複する場合、推測せずにそのラベルは除外されます。その場合はホスト名を使用してください。名前はデプロイメントごとに異なります。通常のセッションで list_relays を実行すると、サーバーが提供するリレーが正確に表示され、拒否された ?relays= では受け付ける名前がすべて一覧表示されます。デプロイメントが提供していない名前を指定すると、受け付ける名前を列挙した JSON-RPC エラーとともに、initialize リクエストが HTTP 400 で失敗します。接続がサーバーのデフォルトに黙って切り替わることはありません。任意のリレー URL は受け付けられないため、公開エンドポイントを利用して、呼び出し元が選んだホストへの WebSocket 接続をサーバーに開かせることはできません。
このようなセッションでは list_relays が defaultRelaysSource: "connector-url" を報告するため、モデルは意図的に絞り込まれたコーパスとデプロイメントの標準コーパスを区別できます。
公開デプロイメント
マネージドインスタンスは次の場所でホストされています。
https://mcp.edufeed.org/mcp
以前の URL https://mcp.amb.edufeed.org/mcp も引き続き有効で、同じデプロイメントを提供します。
3 つのリレーを提供します。amb-relay(デフォルトの wss://amb-relay.edufeed.org)と、呼び出しごとの追加リレーである oersi および sodix です。そのため、…/mcp?relays=sodix を指定すると、SODIX コーパスをデフォルトで検索するコネクターになります。コネクターのデフォルトリレーを選択するを参照してください。
ローカルサーバーと同じストリーミング可能な HTTP プロトコルを使用します。読み取りツールは公開されています。Authorization ヘッダーのないリクエストには、読み取り専用セッション(検索/取得/閲覧/解決)が提供されます。予算を消費する extract_metadata ツールには、mcp:extract スコープを持つ有効な OAuth トークンが必要です。トークンは Keycloak レルムから別途発行されます。運用担当者にお問い合わせください。それ以外のハンドシェイクは上記の curl の例と同じです。読み取り専用で使用する場合は、URL を置き換え、Authorization ヘッダーを削除してください。
公開エンドポイントでは、エッジ(Traefik)で送信元 IP ごとにレート制限が適用されます。特に search_passages は、スタック内の CPU サービスで各クエリを埋め込み表現に変換するため、短時間にリクエストが集中すると制限されます。通常の対話的な使用には影響しません。
利用可能なツール
ツールは 3 つのプロファイルに分類されています。
- 読み取り — 検索、取得、閲覧、解決、SKOS ルックアップ、カレンダー。すべてのトランスポートで利用でき、HTTP 経由では匿名で提供されます。
- 抽出 —
extract_metadata。HTTP 経由で使用するには、mcp:extractスコープを持つ OAuth トークンが必要です。 - 書き込み — 署名、公開、リレー管理、SKOS 語彙ビルダーツール。stdio および Nostr トランスポートでのみ公開され、HTTP 経由では公開されません。
search_content
1 回のランキング付き呼び出しで、すべてのコンテンツタイプを横断してトピックを検索します。教育リソース(30142)、長文記事(30023)、Wiki(30818)、transferkiosk プロジェクト(30143)、transferkiosk 対策(30144)、NKBIP-01 の科学出版物(30040 のインデックス + 30041 のセクション — 学術論文、書籍)が対象です。結果は意味的なパッセージの一致度に基づいて交互に表示され、リレーによるチャンクの再ランキングが有効な場合は、それぞれに一致したパッセージ(snippet)が含まれます。
情報の探索と質問への回答。 search_passages が利用可能な場合(インデクサーが設定されている場合)、意図に応じて 2 つのツールを使い分けます。ユーザーが閲覧する資料を求めている場合(「X に関する資料を見つけて/おすすめして」)は、情報の探索に search_content を使い、項目をリンクとして提示します。情報源に基づく回答を求める質問の場合(「X にはどうすればよいか/なぜか/何が役立つか」)は、代わりに search_passages を使います。インデクサーが設定されていない場合は、自然言語の質問に対する既定のエントリーポイントとして search_content を使います。
パラメーター:
| 名前 | 型 | 説明 |
|---|---|---|
query | string | 自由記述のトピック |
types | string[] | ["resource","article","wiki","project","measure","publication"] のサブセット(既定値:すべて) |
language | string | ラベルの言語(既定値 de) |
since / until | number | Unix タイムスタンプの範囲 |
authors | string[] | 著者の公開鍵(hex) |
limit | number | 結果の最大数、1~250(既定値 20) |
community | string | このコミュニティで共有されているコンテンツを返します(hex 公開鍵または npub) |
relays | string[] | 特定のリレーに限定します — 完全な URL または短縮名(oersi、sodix)。list_relays を参照してください。 |
各結果:{ type, kind, title, url?, naddr?, snippet?, score?, ...type-specific }。
同じトピックの今後のイベントについては、search_calendar_events で追加検索してください。
選択したリレーがタイムアウトするか到達不能な場合、レスポンスには relaysIncomplete(影響を受けたリレー)と warning が追加されます。この警告がある状態で結果が空、または少量であっても、コーパスが空であることの証拠にはなりません。これらのフィールドがない場合は、すべてのリレーから応答がありました。
search_passages
グラウンデッド RAG:質問に最もよく一致する全文のパッセージを取得し、引用元(リソース、ページ、見出し、ソース URL)とともに返します。ユーザーにはパッセージに基づいて回答し、各ソースを引用してください。質問形式のクエリでは、これがデフォルトのツールです。情報を探す場合は search_content を使用してください。インデクサー(INDEXER_ENDPOINTS)が必要です。この設定がない場合、ツールは登録されません。
スコープは必須です(このツールはスコープを指定しない検索を実行しません)が、通常は簡単に指定できます。ソースを限定しない場合は、コンテンツの種類を渡してください。限定する場合は、メタデータの発行者(resolve_publisher で正確な表記を特定)を引用符付きのフィールドフィルター(publisher.name:"LEHRE LADEN")として search に渡すか、Nostr の署名者(resolve_author)を authors に渡します。公開済みのグリモワールスペル(kind 777)を nevent/イベント ID で渡して、スコープを指定することもできます。各応答ではスコープに使用した正規のスペルが返されるため、公開して再利用できます。スペルでは $me/$contacts を使用でき、呼び出し元に応じて解決されます(トランスポートが匿名の場合は me を渡してください)。
ランキング。 インデクサーは Typesense のハイブリッド検索を実行します。search_passages はベクトルの重み alpha: 0.7 を指定するため、セマンティックなランキングが優先され、定型文に含まれるキーワード(「GRUNDSCHULE」、「Kinder」)が上位になるのを防ぎます。インデクサー独自のデフォルト値はキーワード寄りの 0.3 で、リレーの再ランキング処理用に維持されています。検索では min(limit × 3, 100) 個のチャンクを多めに取得し、各ドキュメント(event_coord)につき最大 2 件のパッセージを残し、トップスコアの10%未満のヒットを除外してから、先頭の limit 件を返します。question はユーザーの文をそのまま(「Wie kann ich …?」)使うのではなく、対象と読者層を明示したトピック文にしてください(「Friedenserziehung in der Grundschule: Einstieg in das Thema Frieden mit Kindern」)。スニペットだけがありテキストがないパッセージは、ライセンスによる制限があるか、まだ全文がインデックス化されていません。
パラメーター:
| 名前 | 型 | 説明 |
|---|---|---|
question | string | 根拠となるパッセージを探す質問/トピック |
spell | string | 公開済みスペル:nevent、ノート ID、または 64 桁の 16 進数イベント ID(インラインスコープの代替) |
authors | string[] | インラインスコープ:署名者の公開鍵(hex/npub/$me/$contacts) |
kinds | number[] | インラインスコープ:コンテンツの種類(例:[30142]) |
tag | object | インラインスコープ:タグフィルター 1 件、{ letter, values } |
search | string | インラインスコープ:スコープ内のイベントを選ぶ NIP-50 検索語(複数語のフィールド値は引用符で囲みます) |
since / until | string | インラインスコープ:Unix 秒による絶対時刻、または相対指定(7d、1mo、now) |
me | string | $me の参照先(npub/hex)。デフォルトは呼び出し元の ID |
relays | string[] | リレーの選択(完全な URL または短縮名)。最初にマッピングされたリレーが使用されます |
limit | number | 返すパッセージ数、1〜25(デフォルト 10) |
失敗は明示的に返され、スコープなしの検索が黙って実行されることはありません。empty_scope(リレーは応答したものの、一致する項目がなかった)、relay_unreachable(コンテンツリレーから応答がなかったため、再試行してください)、spell_not_found、no_indexer、indexer_error があります。
クエリ内のファセット構文: リレー側のファセットは独立したパラメーターではなく、NIP-50 のフィールドフィルターとして query 内に指定します。フリーテキストの検索語に追加すると、リレー側で解決されます。例:type:academic(出版物の表示タイプ)、doi:10.1234/abcd.5678(格納値に doi: のプレフィックスを含まない DOI)、keywords:<term>(トピックの語)、partOf:30143:<pubkey>:<d>(指定したプロジェクトの coord に属する出版物/尺度)。これらはトピックの検索語と組み合わせることもできます。例:query: "seminardidaktik partOf:30143:<pubkey>:<d>"。
search_resources
全文検索とメタデータフィルターを使用して、教育リソースを検索します。
パラメーター:
| 名前 | 型 | 説明 |
|---|---|---|
query | string | フリーテキスト検索クエリー |
publisherName | string | 発行者名で絞り込み |
creatorName | string | 作成者/著者名で絞り込み |
subjectLabel | string | 教科ラベルで絞り込み(例:「Mathematik」) |
resourceTypeLabel | string | リソース種別で絞り込み(例:「Video」、「Kurs」) |
educationalLevelLabel | string | 教育レベルで絞り込み |
language | string | ラベルの言語(既定値:「de」) |
authors | string[] | 著者の公開鍵(16進数)で絞り込み — 例:resolve_author または list_known_authors から取得 |
since / until | number | リソース作成時刻の Unix タイムスタンプの範囲 |
limit | number | 最大件数。1~250(既定値:20) |
relays | string[] | 特定のリレーに限定 — 完全な URL または短縮名(oersi、sodix) |
subjectLabel/resourceTypeLabel/educationalLevelLabel フィルターは
フリーテキストではなく、ラベルの完全一致(大文字と小文字は区別しません)です。
登録されていない語句を指定すると、結果は 0 件になります。トピックを表す語は
query に入力し、有効なラベルの確認には browse_* を使用してください。
publisherName/creatorName も完全一致ですが、一致する結果がない場合は、
近い綴りの候補(actorCandidates)が提示されます。
get_resource
naddr、dタグ識別子、またはイベント ID で、単一のコンテンツを取得します。
search_content の結果に含まれる naddr であればいずれも解決できます。リソース、
記事、Wiki、プロジェクト、施策、出版物が対象です。リソース以外の種類は、
完全な AMB リソース形式ではなく、search_content の結果と同じ形式
({ type, kind, title, ... })で返されます。naddr を指定しない
identifier/eventId のみの検索では、作成者/発行者や教育関連のプロパティを含む
教育リソースの全メタデータ(kind 30142)が常に解決されます。
パラメーター:
| 名前 | 型 | 説明 |
|---|---|---|
identifier | string | リソースの dタグ(URL 識別子)— kind 30142 のみを解決 |
author | string | 識別を絞り込むための著者の公開鍵 |
eventId | string | Nostr イベント ID を直接検索 — kind 30142 のみを解決 |
naddr | string | search_content の結果に含まれる NIP-19 naddr — 優先して使用。あらゆるコンテンツ種別に対応 |
レスポンス形式(search_resources および get_resource)
返される各リソースには、標準的な AMB フィールドに加えて、次の項目が含まれます。
nostr.naddr— NIP-19 のアドレス指定可能な識別子(kind=30142、公開鍵、dタグ)。あらゆる Nostr クライアントで使用できます。url— このリソースの edufeed-app ページへの直接リンク。EDUFEED_APP_BASE_URLが設定されている場合にのみ含まれます。 LLM クライアントがリソースを推奨する際は、ユーザーが開けるように、これを Markdown リンク([name](url))として引用してください。
search_content、search_resources、search_calendar_events は、選択した
リレーがタイムアウトした場合、または到達不能だった場合に、relaysIncomplete と
warning を追加します。この警告がある場合、結果が空でもデータが存在しない証拠には
なりません。そのため、ソースに到達できなかったことをユーザーに伝え、再試行を
提案してください。すべてのリレーが応答した場合、これらのフィールドは表示されません。
resolve_author
リレーの kind-0 作成者プロフィールインデックス(NIP-50 検索)を使用して、
組織名または個人名を候補の公開鍵に解決します。これは、名前を指定する質問
(「Jörg Lohrer の最近の記事」など)での入り口となります。名前を解決し、
最適な候補を選んでから、その公開鍵を search_content({ authors: [pubkey] })
または search_calendar_events に渡します。関連度順に並べた候補を最大 limit 件返します。
パラメーター:
| 名前 | 型 | 説明 |
|---|---|---|
name | string | 解決する組織名または個人名 |
limit | number | 候補の最大件数。1~25(既定値:10) |
list_known_authors
設定済みのフォローセット(NIP-51 kind 30000。AMB_AUTHOR_SETS を参照)から
読み込まれた、既知の教育リソース著者の一覧を返します。名前、公開鍵、NIP-05
識別子が含まれます。リレー全体のプロフィールインデックスを検索する
resolve_author とは異なり、手作業で管理されたセットを対象とします。
browse_subjects
利用可能な科目/トピックをリソース数とともに一覧表示します。
browse_resource_types
利用可能な学習リソースの種類(動画、コース、ワークシートなど)を一覧表示します。
browse_educational_levels
利用可能な教育レベル(初等教育、中等教育、高等教育など)を一覧表示します。
relay_stats
リレーの名前、説明、対応する NIP などの情報を取得します。
list_relays
現在のセッションに設定されているすべての AMB リレーを、すべてのクエリで検索される
defaultRelays と、呼び出しごとに選択できる extraRelays に分けて一覧表示します。
(search_content、search_resources、get_resource、search_passages の)relays
パラメーターでは、どちらのグループのリレーも完全な URL または短縮名(ホスト名
または最初のラベル。oersi、sodix、amb-relay など)で指定できます。大文字と
小文字は区別されません。同じラベルが複数のリレーで使われている場合は、より長い
形式でのみ指定できます。defaultRelaysSource は、デフォルトのリレーセットを誰が
選択したかを示します。値は server-config、または接続 URL で指定された場合は
connector-url です
(コネクターのデフォルトリレーの選択を
参照)。書き込みプロファイルでは、実行時にセッションのリレーセットを調整する
add_relay/remove_relay も利用できます(HTTP ではセッション単位、stdio では
プロセス全体に適用されます)。
relay_list_get
ユーザーの NIP-65 リレーリスト(kind 10002)を取得します。レスポンスの形式については、 以下のNIP-65 Outbox Modelを参照してください。
SKOS 語彙ツール
Nostr イベントとしてホストされている、または URI から参照される統制語彙を読み取るツールです。
skos_list_vocabularies— サーバーが把握している語彙を一覧表示しますskos_get_vocabulary/skos_get_vocabulary_status— 概念を含むスキームを取得する/利用可能か確認するskos_get_concept— ラベルと関係性を含む単一の概念を取得しますskos_search— ラベルを使って複数の語彙にわたる概念を検索します
書き込みプロファイルには、SKOS 語彙を作成し、Nostr イベントとして公開するための
語彙作成ツール群(skos_create_vocabulary、skos_add_concept、
skos_update_concept、skos_remove_concept、skos_set_relationship、
skos_add_mapping、skos_import_turtle、skos_export_turtle、
skos_delete_vocabulary)が追加されます。
extract_metadata
1 つ以上の公開ウェブページ(または PDF)を取得し、AMB/EKW フォームへの事前入力用
ペイロードを生成します。デフォルトでは OpenGraph/JSON-LD のフォールバックを返します。
ANTHROPIC_API_KEY が設定されている場合は、設定済みの SKOS 語彙に基づく LLM が、
SKOS 型フィールドに概念 ID とフィールドごとの根拠引用を入力します。ライブラリの
エクスポートとしても利用できます:import { extractMetadata } from 'nope-mcp/lib'。
パラメーター:
| 名前 | 型 | 説明 |
|---|---|---|
url | string | 抽出対象の公開 http(s) URL(複数のソースには urls を使用) |
urls | string[] | 複数のソース URL をまとめて 1 回の抽出に使用します(例:複数の PDF) |
variant | string | フォームのバリエーション:amb(デフォルト)、ekw(宗教教育のフィールドを追加)、konfi(Konfi-Arbeit のフィールドを追加) |
skosSchemes | object | フォームフィールド → SKOS スキーム URI のマップ。SKOS_SCHEMES を上書きします |
取得時には SSRF 対策が行われます(プライベート/ループバック範囲はブロックされます)。
search_calendar_events
NIP-52 カレンダーイベント(日付ベースの 31922、時間ベースの 31923)を検索します。時間フィルター、ジオハッシュによる位置フィルター、ハッシュタグフィルターに対応しています。
パラメーター:
| 名前 | 型 | 説明 |
|---|---|---|
query | string | トピックの自由記述テキスト。**注意:**時間/位置範囲フィルターと組み合わせると、リレーはサーバー側で範囲を優先し、このフィールドを無視します。「来週の X に関するイベント」を検索する場合は、時間範囲を指定し、返されたイベントをクライアント側でトピックに基づいて絞り込んでください。 |
startAfter / startBefore | number | イベント開始時刻の Unix タイムスタンプ範囲 |
endAfter / endBefore | number | イベント終了時刻の Unix タイムスタンプ範囲 |
geohash | string | 位置ベース検索用のジオハッシュプレフィックス |
hashtags | string[] | ハッシュタグによる絞り込み |
authors | string[] | 投稿者の公開鍵(16 進数) |
kinds | number[] | 検索するイベント種別(デフォルト:[31922, 31923]) |
since / until | number | イベント作成時刻の Unix タイムスタンプ範囲 |
limit | number | 最大結果数、1~250(デフォルト:20) |
各イベントには naddr(NIP-19 のアドレス指定可能な識別子)が含まれます。また、EDUFEED_APP_BASE_URL が設定されている場合は、url(<base>/<naddr> にある edufeed-app ビューアー)も含まれます。ビューアーにはより詳しいイベント情報が表示されるため、sourcePage より url を優先して引用してください。
list_calendar_authors
設定済みのフォローセット(NIP-51 kind 30000)から読み込まれた、既知のカレンダーイベント投稿者を一覧表示します。投稿者名、公開鍵、NIP-05 識別子を返します。投稿者でイベントを絞り込むには、返された公開鍵を search_calendar_events(authors: [...]) で使用してください。
署名と公開
MCP サーバーは、NIP-46 リモート署名(bunker)を介した Nostr イベントの署名と公開に対応しています。
署名者への接続
オプション 1:QR コードフロー(推奨)
signer_initを呼び出して nostrconnect:// URL と QR コードを生成します- bunker アプリ(Amber、nsecBunker など)で QR コードをスキャンします
signer_awaitを呼び出して、接続が完了するまで待ちます
オプション 2:Bunker URL
署名アプリから bunker:// URL を取得している場合は、signer_connect を直接使用してください。
オプション 3:秘密鍵(開発専用)
テストでは、nsec と allowInsecure=true を指定して signer_connect を使用してください。本番環境では絶対に使用しないでください。
署名ツール
signer_init
署名アプリに接続するための QR コードを生成します。
パラメーター:
| 名前 | 型 | 説明 |
|---|---|---|
relays | string[] | NIP-46 通信に使用するリレー(デフォルトでは AMB リレー) |
name | string | bunker アプリに表示されるクライアント名 |
permissions | string[] | 要求する権限(例:["sign_event:0", "sign_event:30142"]) |
戻り値:
sessionId-signer_await用のセッション IDnostrconnectUrl- nostrconnect:// URLqrCode- ターミナル表示用の ASCII QR コード
signer_await
QR コードをスキャンした後、bunker アプリが接続するまで待機します。
パラメーター:
| 名前 | 型 | 説明 |
|---|---|---|
sessionId | string | signer_init から取得したセッション ID |
timeout | number | タイムアウトまでの秒数(デフォルト:120) |
signer_connect
bunker URL または秘密鍵を使って直接接続します。
パラメーター:
| 名前 | 型 | 説明 |
|---|---|---|
bunkerUrl | string | 署名アプリから取得した bunker:// URL |
nsec | string | 秘密鍵(nsec または 16 進数)- 開発専用 |
allowInsecure | boolean | nsec を使用する場合に必須 |
signer_disconnect
現在の署名者セッションを切断します。
signer_status
現在の署名者の接続状態を確認します。
戻り値:
connected- 署名者が接続されているかどうかuserPubkey- 接続中のユーザーの公開鍵connectedAt- 接続時刻の ISO タイムスタンプ
公開ツール
sign_event
接続中の署名者を使って、未署名の Nostr イベントに署名します。
パラメーター:
| 名前 | 型 | 説明 |
|---|---|---|
kind | number | イベント種別(例:メタデータの場合は 0、ノートの場合は 1) |
content | string | イベントの内容 |
tags | string[][] | 配列の配列形式のイベントタグ |
publish_event
事前署名済みの Nostr イベントをリレーに公開します。
パラメーター:
| 名前 | 型 | 説明 |
|---|---|---|
event | object | id、pubkey、created_at、kind、tags、content、sig を含む署名済み Nostr イベント |
relays | string[] | 公開先のリレー(デフォルトは AMB リレー) |
useOutbox | boolean | リレーの選択に NIP-65 outbox モデルを使用します(デフォルト:true) |
create_and_publish_metadata
kind 0 のプロフィールメタデータイベントを作成、署名して公開します。
パラメーター:
| 名前 | 型 | 説明 |
|---|---|---|
name | string | 表示名 |
about | string | 自己紹介/説明 |
picture | string | アバターの URL |
banner | string | バナー画像の URL |
nip05 | string | NIP-05 識別子(例:[email protected]) |
lud16 | string | Lightning アドレス |
website | string | ウェブサイトの URL |
relays | string[] | 公開先のリレー |
useOutbox | boolean | リレーの選択に NIP-65 outbox モデルを使用します(デフォルト:true) |
create_and_publish_resource
kind 30142 の AMB 教育リソースイベントを作成、署名して公開します。
パラメーター:
| 名前 | 型 | 説明 |
|---|---|---|
identifier | string | リソースの一意な識別子(d-tag) |
name | string | リソース名/タイトル |
description | string | リソースの説明 |
url | string | リソースの URL |
image | string | 画像/サムネイルの URL |
type | string[] | リソースの種類(例:["LearningResource", "VideoObject"]) |
inLanguage | string[] | 言語コード(例:["de", "en"]) |
about | object[] | id と任意の prefLabel を含む主題概念 |
learningResourceType | object[] | HCRT 語彙に基づく学習リソースの種類 |
educationalLevel | object[] | 教育レベルの概念 |
creator | object[] | name、type、id を含むコンテンツ作成者 |
publisher | object[] | name、type、id を含む発行者 |
license | object | id(URL)と任意の name を含むライセンス |
isAccessibleForFree | boolean | リソースを無料で利用できるかどうか |
datePublished | string | 公開日(ISO 8601) |
relays | string[] | 公開先のリレー |
useOutbox | boolean | リレーの選択に NIP-65 outbox モデルを使用します(デフォルト:true) |
NIP-65 Outbox モデル
公開ツールは、リレーをインテリジェントに選択するため、デフォルトで NIP-65 outbox モデルを使用します。
- 作成者の書き込みリレー - kind 10002 イベントから取得します
- タグ付けされたユーザーの読み取りリレー - p タグでメンションされたユーザーの読み取りリレーを取得します
- デフォルトのリレー - 設定済みの AMB リレーにフォールバックします
これにより、作成者が公開しているリレーと、タグ付けされたユーザーがイベントの受信先として想定しているリレーの両方にイベントが配信されます。
relay_list_get
ユーザーの NIP-65 リレーリスト(kind 10002)を取得します。
パラメーター:
| 名前 | 型 | 説明 |
|---|---|---|
pubkey | string | リレーリストを取得する公開鍵(デフォルトは接続済みの署名者) |
戻り値:
pubkey- 照会した公開鍵readRelays- 読み取り用として指定されたリレー URL の配列writeRelays- 書き込み用として指定されたリレー URL の配列totalRead- 読み取りリレーの数totalWrite- 書き込みリレーの数
利用可能なリソース
| URI | 説明 |
|---|---|
amb://schema | AMB JSON-LD スキーマ |
amb://vocabularies/subjects | 主題語彙 |
amb://vocabularies/resource-types | 学習リソースの種類の語彙 |
amb://vocabularies/educational-levels | 教育レベルの語彙 |
amb://relay-info | NIP-11 リレー情報 |
デプロイ
サーバーには 3 つのエントリーポイントがあります。クライアントに合ったものを選択してください。
src/index.ts(デフォルトのCMD) — Nostr/ContextVM トランスポートです。HTTP ポートはありません。クライアントは、設定済みの ContextVMRELAYS上でサーバーの公開鍵を指定して接続します。SERVER_PRIVATE_KEYが必要です。src/stdio.ts—cvmi serveと Claude Code がローカルのサブプロセスとして使用する、stdio トランスポートです。src/http.ts—HTTP_PORT(デフォルトは3000)で動作する Streamable HTTP トランスポートです。Web ベースの MCP クライアントに使用します。環境変数とハンドシェイクについては、上記のオプション 4を参照してください。
ホストの前提条件
- ランタイムには Node ≥ 20(または Bun ≥ 1.1)が必要です。
- 設定済みの AMB および ContextVM リレーへの送信 WebSocket アクセスが必要です。
extract_metadataツール用に、送信 HTTPS アクセスが必要です(対象ページ、および必要に応じて Anthropic API)。- インストール時に
git.edufeed.orgへのネットワークアクセスが必要です。amb-nostr-converter依存関係は、edufeed npm レジストリから公開済み tarball として取得されます(package.jsonを参照)。
ビルドと実行
bun install # or: npm install
bun run build # tsc -> dist/
node dist/index.js # production entry; uses Nostr transport
ビルド手順なしで開発するには、bun run src/index.ts を実行します。
ID とシークレット
SERVER_PRIVATE_KEYは、サーバーの永続的な Nostr ID です。これを紛失またはローテーションすると、クライアントがサーバーへの接続に使用する公開鍵が変わります。そのため、長期にわたって保持する状態として扱ってください。nak key generate(または任意の Nostr 鍵生成ツール)で作成し、シークレットマネージャーを通じて保存してください。決してコミットしないでください。- 対応する公開鍵を、ユーザーは
cvmi use <pubkey>に渡します。初回起動後に一度表示し、運用担当者が記録できるようにしてください。 ANTHROPIC_API_KEYを使用する場合は、このサービス専用のスコープに設定してください。extract_metadataツールは、SKOS のグラウンディングが要求されるたびにトークンを消費します。
状態と永続化
サーバー自体はディスク上に状態を保持しません。すべての状態は設定済みのリレーに保存されます。再起動後も保持する必要があるのは、SERVER_PRIVATE_KEY を含む環境ファイルだけです。MCP コンテナにボリュームは必要ありません。
検出
Nostr トランスポートで起動すると、サーバーは ContextVM アナウンスを RELAYS に公開します。古いアナウンスを削除するには(鍵のローテーション後やサービスの廃止時など)、scripts/unpublish-server.ts を使用してください。
運用上の注意
- ログ記録: 標準出力/標準エラーに出力します。プロセス監視ツール(systemd journal、Docker logs など)で取得してください。
- ヘルスチェック: Nostr と stdio のエントリーポイントには HTTP ヘルスチェックがありません。稼働状態は「プロセスが動作しており、リレーのサブスクリプションでエラーが発生していないこと」とほぼ同義です。プロセス監視ツール側で確認してください。HTTP エントリーポイントでは、プローブ用に認証なしの
GET /healthzを公開します。 extract_metadataの外部通信: このツールは、呼び出し元が指定した任意の URL を取得します。取得処理は SSRF を考慮しており、プライベート/ループバック範囲はブロックされますが、ホームラボで送信トラフィックを制限している場合は、外部通信プロキシの背後で実行することも検討してください。- リソース使用量: 少量です。少数の WebSocket 接続を持つ単一の Node プロセスで動作します。データベースもキャッシュディレクトリもありません。
開発
テストの実行
bun run test # vitest, no network needed
ローカルリレーに対するテスト
このリポジトリの docker-compose.yml は、Typesense を含むローカル AMB リレーを ws://localhost:3337 で起動します。イメージのビルドには、隣接する ../amb-relay にチェックアウト済みの amb-relay が必要です。
docker compose up -d
AMB_RELAY_URL=ws://localhost:3337 bun run scripts/test-client.ts
スクリプト
scripts/ask.ts—search_contentに自然言語の質問を送信し、LLM クライアントが受け取る構造化された結果を出力しますscripts/test-client.ts— リレークライアントの簡易スモークテスト(リレー情報、クエリ、変換)scripts/smoke-search-content.ts/scripts/smoke-extract-metadata.ts— 開発用リレーに対する実運用スモークテストscripts/unpublish-server.ts— 公開 ContextVM 検出からサーバーを削除しますscripts/delete-announcements.ts— アナウンスイベントの削除を試みます
アーキテクチャ
src/
├── index.ts # Nostr/ContextVM transport entry point
├── stdio.ts # Stdio transport entry point (for cvmi/Claude Code)
├── http.ts # Streamable HTTP transport entry point (OAuth resource server)
├── session.ts # Per-session MCP server factory (relay clients + tool profile)
├── server-info.ts # Server name/version constants
├── authors.ts # NIP-51 follow-set author directories
├── transport/
│ ├── http.ts # Express app + StreamableHTTPServerTransport wiring
│ ├── auth.ts # JWT verification (JWKS)
│ └── prm.ts # OAuth protected-resource metadata document
├── relay/ # AMB relay client + NIP-50 filter builders
├── calendar/ # NIP-52 calendar filters + transforms
├── content/ # Multi-kind content transforms + snippet handling (search_content)
├── profiles/ # Kind-0 profile transforms (resolve_author)
├── skos/ # SKOS vocabulary client, parser, cache, Nostr loader
├── lib/ # extract_metadata library (fetch, PDF, LLM, vocab grounding)
├── signer/ # NIP-46 signing, publishing, NIP-65 relay lists, event builders
├── tools/ # One module per MCP tool (registered via tools/index.ts profiles)
├── resources/ # amb:// MCP resources (schema, vocabularies, relay info)
├── types/ # AMB TypeScript types
└── utils/ # Event → AMB resource transforms, community helpers
ライセンス
これは、パブリックドメインとして公開された、自由に使用でき、いかなる制約もないソフトウェアです。詳細は UNLICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。