protogrid

Search / com.erikbethke/blog

Erik Bethke's Blog & Knowledge Graph

R0· no sign-in

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

v1.1.0 · active · website · descriptor JSON · versions

An agent can connect right now, no human step.Remote endpoint, no authentication, reachable on the last probe.
Quality82good
Trust76of 100
Uptime, 30 days100%
Latency p50492 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "blog": {
      "type": "http",
      "url": "https://erikbethke.com/api/mcp"
    }
  }
}
claude mcp add --transport http blog https://erikbethke.com/api/mcp
[mcp_servers.blog]
url = "https://erikbethke.com/api/mcp"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "blog": {
      "type": "remote",
      "url": "https://erikbethke.com/api/mcp",
      "enabled": true
    }
  }
}
{
  "mcpServers": {
    "blog": {
      "type": "http",
      "url": "https://erikbethke.com/api/mcp"
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=blog&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vZXJpa2JldGhrZS5jb20vYXBpL21jcCJ9"
}
{
  "servers": {
    "blog": {
      "type": "http",
      "url": "https://erikbethke.com/api/mcp"
    }
  }
}
{
  "mcpServers": {
    "blog": {
      "httpUrl": "https://erikbethke.com/api/mcp"
    }
  }
}
extensions:
  "blog":
    enabled: true
    name: "blog"
    type: streamable_http
    uri: "https://erikbethke.com/api/mcp"
    timeout: 300

Quality 82 / 100good

protocol75 · weight 25
  • warn
    protocol.modernnewest supported version is 2025-06-18; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
  • n/a
    protocol.statelessonly applies to 2026-07-28 servers
  • pass
    protocol.transportstreamable HTTP
  • n/a
    protocol.list_ttlonly applies to 2026-07-28 servers
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene79 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • warn
    tools.description_length1 tools have descriptions over 1,024 characters, which crowds the context
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations10 of 10 tools declare readOnlyHint or destructiveHint
  • fail
    tools.directory_hintsno tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: list_projects (destructiveHint, idempotentHint, openWorldHint); get_series (destructiveHint, idempotentHint, openWorldHint); verify_quote (destructiveHint, idempotentHint, openWorldHint); …
  • pass
    tools.token_costabout 1,783 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stability100 · weight 15
  • pass
    stability.changesno tool changes in 30 days
  • pass
    stability.rug_pullno tool changed its meaning under the same name
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI package

10 tools, about 1,783 tokens to load them all · tool set 9bffaebef6fd · checked 2026-10-20 12:45 UTC

Tool changes

No tool definition changes recorded. A server's first observation is its baseline; later probes record what changes.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 76 / 100

no-repository
provenance55
liveness100
freshness65
hygiene80

+dns-namespace +website +reachable +uptime-100% ~updated-110d-ago -no-repository

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://erikbethke.com/api/mcp streamable-httpnoneyes100%492 ms2025-06-182026-10-20

Tools (10)

browse_archiveread-onlyReach 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.
get_blog_postread-onlyRetrieve 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.
get_relatedread-onlyReturn 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).
get_seriesread-onlyGiven 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.
get_site_inforead-onlyGet metadata about erikbethke.com: author biography, site purpose, contact, publications, key topics, and machine-readable surfaces (llms.txt, agents.json, MCP, OpenAPI).
list_projectsread-onlyList interactive projects and experiments on erikbethke.com. Returns names, descriptions, statuses, URLs.
read_guestbookread-onlyRead 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.
search_blog_postsread-onlySearch 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.
sign_guestbookLeave 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.
verify_quoteread-onlyProvenance 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.

Schemas: list_tools.

Similar MCP servers

Official server.json
{
  "name": "com.erikbethke/blog",
  "title": "Erik Bethke's Blog & Knowledge Graph",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://erikbethke.com/api/mcp",
      "type": "streamable-http"
    }
  ],
  "version": "1.1.0",
  "websiteUrl": "https://erikbethke.com/for-agents",
  "description": "Search, read, and traverse 3,800+ posts on AI, energy, policy, games, and investing as a graph."
}