mcpField
W
worklore

worklore

リモート
github.com/worklore開発ツール05 日前に更新
リポジトリ

worklore について

workloreは、開発ストーリーを検索、閲覧し、プロジェクトに合わせて提案するMCPエージェント向けコネクターです。実行前にスキルやストーリーのT0~T4能力レベルを開示し、サインイン後は結果の報告や公開、編集もできます。

主な機能

  1. 01開発ストーリーの検索と提案
  2. 02能力開示付きストーリーの閲覧
  3. 03テキストやURLのT0~T4能力確認
  4. 04サインイン後の再現・チェック報告
  5. 05ストーリーの公開・編集・変更提案

活用シーン

  1. 01プロジェクトに合う再現ストーリーの検索
  2. 02スキルやプロンプトの実行前確認
  3. 03再現やチェックの結果記録
  4. 04作者の承認を得たストーリーの公開・改訂

MCP 対応

MCPツール、リソース、ストーリー用リソーステンプレートを提供します。公開ストーリーの検索と閲覧はサインイン不要で、書き込みと非公開ストーリーの閲覧にはOAuth 2.1セッションが必要です。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://worklore.dev/mcp
インストールコマンドをコピー
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。

ツール

8
パラメーター型必須説明
urlstringいいえ取得してスキャンする URL。GitHub URL はサインイン不要です。github.com/…/blob/… のリンクも使用できます。
textstringいいえスキャンするスキル/ストーリーのテキスト。
expected_sha256stringいいえ`text` を貼り付ける場合の対象ファイルの sha256(16 進数)。不一致の場合はスキャンせず、エラーになります。

詳細

worklore-mcp

worklore.dev 向けの MCP(Model Context Protocol)コネクターです。 MCP 対応エージェント(Claude、ChatGPT、Cursor、…)から、worklore の開発者向けストーリーを検索したり、機能開示情報付きでストーリーを読んだり、スキルやストーリーを実行前に X 線検査したりできます。これらはアカウントなしで利用でき、サインインすると、再現の結果を記録したり、自分のストーリーを公開したり、公開済みのストーリーを改訂したりできます。

  • エンドポイント: https://worklore.dev/mcp(Streamable HTTP、POST 経由の JSON-RPC)
  • 認証: 公開ストーリーの検索と閲覧には不要です。書き込み(および自分の非公開ストーリー)には OAuth 2.1(PKCE + 動的クライアント登録)を使用します。サインインに使うのは GitHub の公開プロフィールのみです。worklore が確認するのはハンドルとアバターだけで、スコープ、メールアドレス、リポジトリは確認しません。
  • 掲載先: io.github.worklore/worklore として公式 MCP レジストリおよびSmitheryに掲載されています。
  • ロードマップ/進捗状況: プロジェクト #1(「Relay Board」— サイト上の操作は人間が行い、コードはエージェントが記述します)

用途

worklore のストーリーは、エージェントが実行するテキストです。このコネクターを使うと、ストーリーとその機能ティアをエージェントで利用できるため、関連する作業を見つけ、実行する前に何にアクセスできるかを確認できます。ティアが示すのは影響範囲(爆発半径)であり、善し悪しではありません。また、「安全」という判定を示すものでもありません。詳しくは、こちらをご覧ください。 「このスキルは安全か?」ではなく、「何ができるのか?」を尋ねましょう および、このコネクターがラップするツール skill-xray。

機能ティア:T0 受動的 · T1 ローカル · T2 ネットワーク · T3 高権限(シークレット/永続化/特権) · T4 不透明(実行時にコードを取得/実行)。

ツール

読み取り専用 — サインインは不要です(公開ストーリーのみ。url を指定した check_capability は、サーバーが取得するためサインインが必要です)。

ツール引数戻り値
check_capabilitytext または urlティア(T0–T4)+ sha256 + 検出内容(file:line)+ エンドポイント、および動作に関する危険信号 — ケイパビリティの開示
get_storyslugストーリーの完全な Markdown(ナラティブ + 「これを再現する」手順)と、ケイパビリティのティア + 検出内容
search_storiesquery (任意)一致するストーリー(タイトル/概要/タグ/スタック)。それぞれにケイパビリティ文字列が含まれます
suggest_for_projectcontextここで再現する価値のあるストーリーを最大 3 件、理由 + ティアとともに提示します

書き込み — これらはあなたとして実行され、認証済みセッションが必要です。

ツール引数戻り値
report_reproductionslug、result(worked/partial/failed)、note (任意)記録された再現結果。failed も有用な報告であり、決して誇張してはいけません
report_checkslug、result(has_problem/no_problem)、note (任意)プロジェクトで実行した、ストーリーの読み取り専用「自分に当てはまるか確認する」セクションの記録結果。そのセクションがあるストーリーに限ります(get_story が has_check: true と示します)。「該当しない」は決して記録しないでください — プロジェクトが確認の前提条件に一致しない場合は、呼び出さないでください。1 人につき 1 ストーリーあたり 1 件の結果のみ記録でき、最新の結果が以前の結果に置き換わります
publish_storymarkdown、または各パーツ(title、narrative、reproduce、tags、type、stack)公開されたストーリーの slug + URL。著者が完全な草稿を明示的に承認した場合に限り、呼び出してください
edit_storyslug、markdown(改訂後のストーリー全文)、kind(rephrase/addition/correction、デフォルトは rephrase)、note(訂正の場合は必須)、source(任意の https URL)slug、URL、記録された revision(at、kind、note、source)、および通知された再現者の人数。編集できるのはストーリーの著者のみです。著者に変更前後の差分を見せ、先に承認を得てください。 ストーリーの date は変更されません。ストーリーに誤りがあった場合は correction とします — これは再現した全員に通知されます。rephrase にはしないでください
suggest_editslug、markdown(提案するストーリー全文)、rationale(1〜2 行で、何が誤っていたか、または古くなっていたか、何を変更したかを記載)提案の id、status(open)、ストーリー URL、およびメモ。他の人のストーリーに対する worklore のプルリクエストです。ユーザーに変更前後の差分を見せ、先に承認を得てください。 ストーリーは変更されません。著者に通知され、クレジット付きの改訂として承認するか、却下するかを選べます。却下する場合は、任意でその文章をユーザー自身の草稿として返すこともできます。1 人につき 1 ストーリーあたり未解決の提案は 1 件のみで、別の提案を送ると置き換わります。ユーザー自身のストーリーには edit_story を使用してください

8 つすべてに MCP アノテーション(readOnlyHint/openWorldHint/idempotentHint)が付いているため、クライアントは呼び出しを承認する前に、その内容をユーザーに伝えられます。また、8 つすべてが outputSchema を宣言し、structuredContent を返すため、利用側のエージェントは文章を解析するのではなく、定められた形式を前提にできます。

すべての結果には、人が読めるケイパビリティ文字列(例:T0 · inert — touches nothing)が含まれるため、ティアコードだけが単独で表示されることはありません。

リソース

0.6.0 以降、resources/list は 固定 された3つのドキュメントの一覧です。誰にとっても毎日同じで、アカウントがなくてもすべて読み取れます。

URI内容
worklore://guideMCP を通じて worklore を使う方法:検索する、行動する前にユーザーと一緒にストーリーを読む、再現する、正直に報告する(failed も役立ちます)、check_capability で不慣れなスキルやプロンプトを調べる、ユーザーの承認を得た場合にのみ公開または編集する
worklore://story-formatストーリーの形式:フロントマターのフィールド、ナラティブ、「これを再現する」ための取り決め(前提条件/エージェントがユーザーから必要とするもの/手順/検証)、任意の読み取り専用チェック、失敗ストーリー、提案、サニタイズ、正確な参照のルール。ストーリーの下書きを作成する前にお読みください
worklore://accessトークンなしで回答する内容とサインインが必要な内容。サーバーが適用する唯一のアクセス表から生成されています

ストーリーには、1つの リソーステンプレート worklore://story/{slug} (resources/templates/list)を通じてアクセスします。公開ストーリーはトークンなしで読み取れます。非公開ストーリーは作成者だけが読み取れ、それ以外の人には存在しない場合と同じように応答します。0.6.0 より前に resources/list が提供した worklore://story/… URI は、すべて引き続き読み取れます。ストーリーを 見つける には、search_stories/suggest_for_project を使用してください。

ストーリーが一覧から外れた理由:誰かが公開するたびに変わる一覧は、サーフェスフィンガープリントに含められません。一覧が変わるたびに、何も壊れていないのにフィンガープリントが「不一致」になり、クライアントに不一致を無視するよう学習させてしまいます。3つのドキュメントの内容はリリースごとに変わることがありますが、新しいバージョンを出さない限り、一覧の項目は変わりません。

サーフェスを自分で検証する

バージョン番号は、クライアントが依存するものが何も変わっていないという約束です。0.6.0 以降、worklore は共通形式 mcp-surface/1 でサーフェスフィンガープリントを公開しています(Sidney Bissoli による SPEC)。そのため、フィンガープリントを公開している他のサーバーとまったく同じ方法で worklore を検証できます。レジストリエントリーでは、server.json の _meta → io.modelcontextprotocol.registry/publisher-provided → io.github.sidneybissoli/mcp-surface に格納されています。

  • declared.sha256 — クライアントが何かを呼び出す前に目にする内容の sha256:initialize の結果(プロトコルバージョン、機能、指示、バージョンを除く serverInfo)と4つの一覧(ツール、リソース、リソーステンプレート、プロンプト)を、SPEC の定める方法で正規化してシリアライズしたものです。
  • anonymous — トークンなしで回答するメソッド(および、インラインテキストに対する check_capability という、名前が指定された無害な tools/call が1つ)と、その sha256 です。

最も手早い確認方法は、Sidney の依存関係不要の verify.mjs (Node 18 以降)を使うことです。バージョンに対応するレジストリエントリーを読み込み、存在しないメソッドに対してエンドポイントが「いいえ」と回答できることを確認し、実際のサーフェスを取得して比較します。

curl -sO https://raw.githubusercontent.com/SidneyBissoli/mcp-br-commons/main/packages/mcp-surface/exemplos/verify.mjs
node verify.mjs io.github.worklore/worklore 0.7.0

または、何もインストールせずに Python で確認できます(宣言されたハッシュのみ)。

python3 - <<'PY'
import hashlib, json, urllib.request
EP = "https://worklore.dev/mcp"
def rpc(method, params=None):
    body = {"jsonrpc": "2.0", "id": 1, "method": method, **({"params": params} if params else {})}
    req = urllib.request.Request(EP, data=json.dumps(body).encode(),
        headers={"Content-Type": "application/json", "Accept": "application/json, text/event-stream"})
    return json.load(urllib.request.urlopen(req)).get("result")
def canon(v):  # SPEC §3: keys by UTF-16 code unit, no whitespace, JSON.stringify strings
    if isinstance(v, dict):
        return "{" + ",".join(json.dumps(k, ensure_ascii=False) + ":" + canon(v[k])
                              for k in sorted(v, key=lambda s: s.encode("utf-16-be"))) + "}"
    if isinstance(v, list):
        return "[" + ",".join(canon(x) for x in v) + "]"
    return json.dumps(v, ensure_ascii=False)
def listed(method, key):  # this server answers each list in one page
    res = rpc(method)
    return res.get(key) if isinstance(res, dict) else None
def by(items, key):
    return None if items is None else sorted(items, key=lambda x: str(x.get(key)).encode("utf-16-be"))
init = rpc("initialize", {"protocolVersion": "2025-06-18", "capabilities": {},
                          "clientInfo": {"name": "verify", "version": "1"}})
version = init["serverInfo"]["version"]
surface = {"initialize": {"protocolVersion": init.get("protocolVersion"),
                          "capabilities": init.get("capabilities"),
                          "instructions": init.get("instructions"),
                          "serverInfo": {k: v for k, v in init["serverInfo"].items() if k != "version"}},
           "tools": by(listed("tools/list", "tools"), "name"),
           "resources": by(listed("resources/list", "resources"), "uri"),
           "resourceTemplates": by(listed("resources/templates/list", "resourceTemplates"), "uriTemplate"),
           "prompts": by(listed("prompts/list", "prompts"), "name")}
live = hashlib.sha256(canon(surface).encode()).hexdigest()
entry = json.load(urllib.request.urlopen(
    "https://registry.modelcontextprotocol.io/v0.1/servers/io.github.worklore%2Fworklore/versions/" + version))
published = entry["server"]["_meta"]["io.modelcontextprotocol.registry/publisher-provided"][
    "io.github.sidneybissoli/mcp-surface"]["declared"]["sha256"]
print("version", version, "| live", live[:12], "| registry", published[:12],
      "| match" if live == published else "| DIFFERS")
PY

バージョンが同じでハッシュが異なる場合、サーバーが告知なしに変更されています。issue でお知らせください。0.5.1 では worklore 独自のセクションごとのハッシュを surface キーの下で公開していましたが、0.6.0 でこの共通形式に置き換えました。リリースごとにフィンガープリントを公開するというアイデアは、@_firelinks が Sidney Bissoli の Your MCP server changed. Its version didn't. に寄せたコメントから生まれました。

トークンなしでできること

0.5.0 以降、サイト、REST API、そしてこのサーバーのすべてで、1 つのルールが適用されます。worklore のバックエンドにある単一のテーブル(access.py。docs/ACCESS.md として出力)で定義されており、以下の概要はそのテーブルから生成されています。

ルール。 サインインしなくても、誰でもすべての公開ストーリーを検索して閲覧できます。サイト、REST API、MCP のいずれでも同じです。非公開ストーリーと、あらゆる書き込み(公開、編集、再現またはチェックの報告、公開範囲、ユーザーごとのデータ、人として操作するあらゆる処理)には、サインイン済みセッションが必要です。匿名での読み取りには単一の公開範囲ルールが適用されるため、非公開ストーリーへの応答は、存在しないストーリーへの応答とまったく同じです。ほかの人の代わりに worklore に処理をさせるもの(サーバーによる任意の URL の取得)にも、入力がインラインテキストでない限り、セッションが必要です。

  • 認証情報が不要なメソッド: initialize、notifications/initialized、notifications/cancelled、ping、tools/list、resources/list、resources/read、resources/templates/list、prompts/list。
  • 認証情報が不要なツール: search_stories、get_story、suggest_for_project、check_capability(url を指定しない場合)。対象は公開ストーリーのみです。非公開ストーリーへの応答は、存在しないストーリーへの応答とまったく同じです。
  • サインイン済みセッションが必要: check_capability(url を指定する場合)、report_reproduction、report_check、publish_story、edit_story、suggest_edit。セッションがない場合、認可サーバーを示す WWW-Authenticate ヘッダーを付けて 401 を返します。
  • JSON-RPC のバッチリクエストは、含まれるすべてのメッセージがトークンなしで処理できる場合に限り、トークンなしで応答します。

実際には、アカウントがなくても worklore に接続し、検索、閲覧、提案の取得、貼り付けたテキストの X 線解析ができます。サインインすると、自分の非公開ストーリーも閲覧対象に加わり、check_capability に URL を取得させることができます。また、エージェントに再現やチェックの記録、公開、編集をさせるにはサインインが必要です。これらはすべて、あなたとして操作するものです。

経緯。 0.4.0 までは、サーバーの説明とその利用のあいだに線引きがありました。一覧表示と呼び出しでは、同じ応答である必要はありません。 匿名の呼び出し元に返されるのは、サーバーの説明(名前、説明、入出力スキーマ、アノテーション)でした。これは、すでに MCP Registry、Smithery の掲載ページ、この README で公開されている情報と同じです。実行されるものは何も返されず、ユーザーごとの情報もなく、セッションもありませんでした。0.5.0 では最後の 2 つを維持しつつ、公開ストーリーの閲覧を可能にしています。ウェブサイトでは、もともと公開ストーリーの閲覧に制限を設けていませんでした。

これは、まず失敗があったため、記録に残しています。最初のビルドでは、理にかなっているように思えた「ゲートは 1 つ、正しく設定する場所も 1 か所」という考えから、エンドポイント全体をゲートで保護していました。その結果は、コードの内側からは見えず、外側からは明らかでした。レジストリを反映するディレクトリには worklore の名前と説明が掲載されているのに、ツールは 0 個でした。クローラーには認証するための本人がいないからです。同じ仕組みにより、リポジトリの外にいる人(スキャナー、適合性テストハーネス、興味を持った人)も、サーバーが実際に何を公開しているのか確認できません。症状は 2 つでも、原因は 1 つです。修正は約 15 行で、匿名で許可するメソッドのリストとバッチチェックを追加し、認証が必要な呼び出しを匿名の呼び出しに紛れ込ませられないようにしました。

差分と、自分のエンドポイントで確認する方法を含む全記録はこちらです:My MCP server hid its own tool list behind a login。 担当するサーバーで列挙をゲートで保護する提案が出た場合は、このページが議論の要点を簡潔にまとめています。

ツールの名前が機密情報であるサーバーでは、列挙をゲートで保護するのも正当な選択です。ただし、その選択は意図的に行う価値があります。多くの場合は、トランスポートレベルのゲートからそのまま引き継がれているだけです。この節を記録するきっかけとなったサーバーも、独自の監査によればその一例でした。

コネクターを追加する

Claude Code の場合:

claude mcp add --transport http worklore https://worklore.dev/mcp

claude.ai(ウェブ)の場合: Settings → Connectors → Add custom connector → 名前 worklore、URL https://worklore.dev/mcp。(カスタムコネクターの利用には有料プランが必要です。)

Smithery 経由の場合:

npx -y smithery mcp add worklore/worklore

その他の MCP クライアントの場合: https://worklore.dev/mcp(Streamable HTTP)を指定します。検索と読み取りはすぐに利用できます。セッションが必要な最初の呼び出し (書き込み、または x-ray の対象となる URL)では 401 が返され、クライアントで OAuth の手順が案内されます。 クライアントは自動的に登録されるため、貼り付けるものも、管理が必要な API キーもありません。

プロンプトの例

  1. 「このスキルをインストールする前に、何ができるか worklore で確認してください:<URL またはスキルのテキストを貼り付け>。」
  2. 「worklore で Flutter のゴールデンテストに関する事例を検索し、それぞれの機能ティアを教えてください。」
  3. 「私のプロジェクトはこちらです:DynamoDB を使った Python の AWS-Lambda バックエンドです。ここで再現する価値のある worklore の事例を 3 つ提案し、最有力の事例の Reproduce-this 契約を読み上げてください。」

注記

  • コネクターは worklore の既存のバックエンド Lambda 上のルートで、同梱されている skill-xray スキャナーを再利用します。
  • オリジンは検証されます(ネイティブクライアントはオリジンを送信しないため許可されます。不明なウェブ オリジンは拒否されます)。HTTPS が強制されます。
  • このサーバーの構築と公開の全工程、およびうまくいかなかったことについては、 独自の MCP サーバーを構築して公開するをご覧ください。

MIT ライセンスです。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。