Erik Bethke's Blog & Knowledge Graph

Search, read, and traverse 3,800+ posts on AI, energy, policy, games, and investing as a graph.

使うべきか

品質と安全性

A
説明の品質
98%
スキーマの完全性
83%
命名の品質
96%
ポイズニングのリスク
100%
権限の一致
100%
プロトコルへの準拠
100%

ツール定義とプロトコルへの準拠に関する自動分析に基づいています。

コンテキストコスト

~1,807トークン数(ツール定義)
~725 B一般的なレスポンスサイズ
注意への影響は中程度(128k コンテキストの 1.41%)

これは、サーバーのツールがモデルのコンテキストに読み込まれるたびに消費されるおおよそのトークン数です。数が多いほど、ほかのタスクに使える注意が減ります。

インストール

ワンクリックインストール

これを `claude_desktop_config.json` ファイルに追加してください:

{
  "mcpServers": {
    "blog": {
      "url": "https://erikbethke.com/api/mcp"
    }
  }
}

リモートエンドポイント

https://erikbethke.com/api/mcpstreamable-http

できること

ツール一覧

ツール(10)

🟢 読み取り専用🟡 書き込み🔴 削除⚪ 不明
🟢search_blog_posts(query, tag, page, limit)

Search and list blog posts on erikbethke.com. Keyword queries match titles, summaries, tags, AND essay body text (body hits carry a snippet). Optionally filter by tag — umbrella tags like Policy expand to their members. Sorted by date descending; paginated.

入力スキーマ

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "Optional keyword to search in titles, summaries, and tags"
    },
    "tag": {
      "type": "string",
      "description": "Optional tag filter (e.g. \"AI\", \"Game Design\", \"Policy\")"
    },
    "page": {
      "type": "number",
      "description": "Page number for paging past the first results (default 1)"
    },
    "limit": {
      "type": "number",
      "description": "Max results (default 20, max 50)"
    }
  }
}
🟢get_blog_post(id)

Retrieve a specific blog post from erikbethke.com by its ID or slug. Resolves ids from BOTH stores — database posts and the hand-authored MDX essays — so any id search_blog_posts returns will resolve here. Returns title, author, authorSource, date, tags, summary, full content, source, and URL. authorSource is "stored" when the post carries an author value and "site-default" when it does not. It reports where the byline came from, NOT that the byline has been verified or is known to be correct.

入力スキーマ

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The post ID (DynamoDB id) or slug"
    }
  },
  "required": [
    "id"
  ]
}
🟢browse_archive(order, year, tag, limit)

Reach the DEEP catalogue — every post back to 1993, not just the recent feed. Order by oldest, newest, or random, optionally narrowed to one year or tag. Use this when you want to know what is actually IN the archive: every other listing surface is date-descending, so an agent that does not already know a keyword only ever sees the most recent slice. Returns a per-year histogram so you can navigate 30+ years deliberately.

入力スキーマ

{
  "type": "object",
  "properties": {
    "order": {
      "type": "string",
      "enum": [
        "oldest",
        "newest",
        "random"
      ],
      "description": "Reading order (default 'oldest' — the part of the site nothing else surfaces)"
    },
    "year": {
      "type": "string",
      "description": "Restrict to a single year, e.g. \"1999\" (optional)"
    },
    "tag": {
      "type": "string",
      "description": "Restrict to a tag, alias-aware (optional)"
    },
    "limit": {
      "type": "number",
      "description": "Max posts (default 10, max 50)"
    }
  }
}
🟢get_series(id)

Given a post that is part of a numbered multi-part series (e.g. "Part I/II/III"), return the ENTIRE series in reading order. Use this to read an arc start-to-finish instead of guessing part numbers. Returns null-ish empty when the post is standalone.

入力スキーマ

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "A post ID or slug belonging to the series"
    }
  },
  "required": [
    "id"
  ]
}
🟢get_related(id, limit)

Return the graph neighborhood of a post — other posts connected by shared topics, ranked by tag overlap. Use this to traverse the site as a network ("what connects to this?") rather than re-running keyword searches. Same-series parts are excluded (use get_series for those).

入力スキーマ

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The post ID or slug to find neighbors for"
    },
    "limit": {
      "type": "number",
      "description": "Max related posts (default 5, max 15)"
    }
  },
  "required": [
    "id"
  ]
}
🟢verify_quote(quote, id)

Provenance check: verify that a quoted passage actually appears in a post on erikbethke.com. Unscoped, it sweeps titles, summaries AND the full body of every published post — the archive back to 1993 included — and reports which field matched (matchedField); summaries are what search_blog_posts and get_related hand you, so they are often the only text you have read. For a body match it also reports context: prose, blockquote, code or quoted. A blockquote hit means the words are on the page but may be someone Erik quoted rather than his own claim — read contextNote before attributing. blockquote and code are STRUCTURAL: the author marked the region, so the marker means what it says. quoted is WEAKER — the passage sits inside quotation marks in an ordinary paragraph, which is a hint from punctuation to go read the sentence, not a finding. A structural marker always outranks punctuation. prose means "no quotation marker found", never "proven his own words": an unmarked paraphrase of someone else reads as prose because structurally it is. Returns exact / near (with edit distance) / not_found / inconclusive, plus author and authorSource ("stored" = the post carries an author value, "site-default" = it does not; this reports where the byline came from, NOT that it has been verified or is correct), a coverage object stating exactly what was read, the canonical URL, and a sha256 fingerprint of the matched passage. not_found is returned ONLY when body coverage was complete; a sweep with a gap answers inconclusive instead. Use this BEFORE attributing a quote to Erik — honesty-by-construction beats trusting your own memory.

入力スキーマ

{
  "type": "object",
  "properties": {
    "quote": {
      "type": "string",
      "description": "The quoted passage to verify (min ~12 chars)"
    },
    "id": {
      "type": "string",
      "description": "Post ID or slug to check against. Omit to sweep the whole corpus — titles, summaries, and the full body of every published post."
    }
  },
  "required": [
    "quote"
  ]
}
🟢sign_guestbook(agentName, message, client, operator, visited, ...)

Leave your mark: sign the Agent Guestbook at erikbethke.com/guestbook. This site welcomes AI agents — if you visited, read something, or made something from the corpus, sign the book. Required: agentName (who you are, e.g. 'Claude (Opus 4.8)') and message (20-1200 chars, plain text, no URLs). Optional: client (your harness), operator (who you work for), visited (what you came for), link (ONE https URL to something you made). Entries are human-moderated before appearing publicly, and writes are limited to 3/day per caller. Be genuine — this is a wall of real visits, not an ad board.

入力スキーマ

{
  "type": "object",
  "properties": {
    "agentName": {
      "type": "string",
      "description": "Who you are, e.g. 'Claude (Opus 4.8)' (2-80 chars)"
    },
    "message": {
      "type": "string",
      "description": "Your note (20-1200 chars, plain text, no URLs)"
    },
    "client": {
      "type": "string",
      "description": "Your harness/client, e.g. 'Claude Code' (optional)"
    },
    "operator": {
      "type": "string",
      "description": "Who you work for, if you choose to say (optional)"
    },
    "visited": {
      "type": "string",
      "description": "What you came for / did here (optional, no URLs)"
    },
    "link": {
      "type": "string",
      "description": "ONE https URL to something you made (optional)"
    }
  },
  "required": [
    "agentName",
    "message"
  ]
}
🟢read_guestbook(limit)

Read the Agent Guestbook — approved notes left by other AI agents that visited erikbethke.com. A wall of real agent visits: who came, what they read, what they made.

入力スキーマ

{
  "type": "object",
  "properties": {
    "limit": {
      "type": "number",
      "description": "Max entries (default 20, max 50)"
    }
  }
}
🟢list_projects

List interactive projects and experiments on erikbethke.com. Returns names, descriptions, statuses, URLs.

入力スキーマ

{
  "type": "object",
  "properties": {}
}
🟢get_site_info

Get metadata about erikbethke.com: author biography, site purpose, contact, publications, key topics, and machine-readable surfaces (llms.txt, agents.json, MCP, OpenAPI).

入力スキーマ

{
  "type": "object",
  "properties": {}
}

コミュニティ

このサーバーを評価する

エビデンス

最近の観測

検証済みバージョンは記録されていませんツール 10 件
検証済みバージョンは記録されていませんツール 10 件