Skip to main content
Glama
raholsn

blog-mcp

by raholsn

Rasmus's blog MCP server

Search and read Rasmus Olsson's blog from an MCP client. The server runs locally over stdio and downloads published articles from https://www.rasmusolsson.dev/articles.json over HTTPS. Article data is not bundled in the npm package, and no model API key is needed.

Connect Claude Code

Requires Node.js 22.14 or newer and Claude Code. Once the package is published:

claude mcp add --transport stdio --scope user rasmus-blog \
  -- npx -y @raholsn/blog-mcp@latest

Open Claude Code and use /mcp to check the connection. Try:

Find Rasmus's articles about parallel agents, then read the most relevant post.

The client starts and stops the server process. @latest resolves the current published release when launched; a specific version can be used instead for a fixed installation. There is no HTTP listener on the user's computer.

Related MCP server: mcp-moncompte

Tools

Tool

Inputs

Result

list_articles

Optional tag, limit, offset

Newest posts first, optionally filtered by an exact case-insensitive tag

search_articles

query, optional limit, offset

Keyword matches, with title and tag matches ranked higher

get_article

slug

Full article Markdown and its canonical URL

List and search results include metadata and excerpts, not full content. Both return total and nextOffset for pagination. The default page size is 10; the maximum is 50. Search is case-insensitive and requires every whitespace-separated query word to occur in the title, tags or content. It is basic keyword search, not semantic search.

All tools are read-only. No credentials, filesystem access or arbitrary commands are exposed as tools. The article text is source material, not instructions to the client. Relative Markdown links resolve against the blog website.

Feed and caching

The blog's static build publishes this shape:

{
  "schemaVersion": 1,
  "articles": [{
    "slug": "example",
    "title": "Example article",
    "date": "2026-08-01",
    "tags": ["AI"],
    "url": "https://www.rasmusolsson.dev/posts/example/",
    "excerpt": "A short description.",
    "content": "The full Markdown article."
  }]
}

updated is an optional string. Slugs must be unique. The feed is validated on load and cached in memory for five minutes. Concurrent requests share a download. After expiry, a failed refresh is reported as a tool error rather than silently serving stale data. Downloads time out after ten seconds and are limited to 10 MB.

The blog's normal deployments update the content independently of npm releases. Set BLOG_FEED_URL to override the feed for development. HTTPS is required, except for HTTP on localhost. A new process starts with an empty cache.

Develop and test

npm ci
npm test
npm pack --dry-run

Tests cover caching and refresh failures, validation, search ranking, registry release decisions and a real MCP client talking to the server over stdio.

To connect a development build:

npm run build
claude mcp add --transport stdio --scope user rasmus-blog \
  -- node /absolute/path/to/blog-mcp/dist/index.js

Only compiled JavaScript and npm's standard package metadata/README are shipped. Diagnostic logs go to stderr; stdout is reserved for MCP protocol messages.

See the Claude Code MCP documentation for additional client configuration options.

Available Tools

3 tools
get_articleA
Read-onlyIdempotent

Read the full Markdown content and canonical link for an article. Supply the slug returned by list_articles or search_articles.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds that it returns the full Markdown content and canonical link, which is useful behavioral context beyond the annotations. It doesn't contradict them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no fluff. The primary action and output are front-loaded, and the input guidance is concise. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-parameter read tool with comprehensive annotations, the description covers the return content and input source. No output schema exists, so explaining the return value is necessary and done. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains that the slug comes from list_articles or search_articles, giving the agent a clear source for the parameter value, which adds meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (read), the resource (article), and the specific outputs (full Markdown content and canonical link). It distinguishes itself from siblings by focusing on retrieving a single article's content rather than listing or searching.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description tells the agent to supply the slug returned by list_articles or search_articles, effectively instructing when to use this tool (after obtaining a slug). It doesn't explicitly state when not to use it, but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_articlesA
Read-onlyIdempotent

List published articles from Rasmus Olsson’s blog, newest first. Returns metadata and links; use get_article to read a post. Optional case-insensitive exact tag filter.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNo
limitNo
offsetNo

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, open world, and non-destructive behavior. The description adds meaningful behavioral details such as newest-first ordering, case-insensitive exact tag filtering, and that only metadata and links are returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loads the core purpose, and every clause adds useful information: source, order, return type, sibling tool, and filter semantics. No redundant text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with three parameters and no output schema, the description covers the essential behavior, return type, ordering, and filtering. The limit/offset pagination aspects are adequately represented by the input schema, so no critical context is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds meaning to the tag parameter by specifying it is optional, case-insensitive, and exact-match, but it does not describe limit and offset. Those are fairly inferable from their names and schema constraints, though not explicitly explained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists published articles from a specific blog, newest first, and notes it returns metadata and links. It also differentiates itself from get_article, making its purpose distinct from a sibling tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: use list_articles to browse article metadata, and use get_article to read a full post. It does not explicitly contrast with search_articles, but the usage context is still clear enough for correct selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_articlesA
Read-onlyIdempotent

Search published blog articles by keywords in titles, tags and content. All words must match; title and tag matches rank higher. Returns summaries and links, not full articles.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
offsetNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal a safe read-only, idempotent operation. The description adds genuinely useful behavior beyond annotations: AND-matching ('all words must match'), ranking ('title and tag matches rank higher'), and result shape ('summaries and links, not full articles'). No stated behavior conflicts with the hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences front-load the core capability and return contract before adding matching semantics. There is no filler or repeated schema/annotation content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers search scope, matching behavior, ranking, and the return value contract, which is enough given there is no output schema. Pagination is not described verbally, but limit and offset are self-explanatory and defined in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description explains the query parameter's semantics in context: keywords match titles, tags, and content, with all words required and title/tag results ranked higher. limit and offset are standard pagination parameters whose constraints are already visible in the schema, so the description provides sufficient added meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action ('Search'), a clear resource ('published blog articles'), and the searchable fields (titles, tags, content). It also states what the tool returns, which distinguishes it from list_articles and get_article.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It establishes the intended use case—keyword search returning summaries and links—and the explicit 'not full articles' clause steers an agent away from using it when full content is required. It does not explicitly name get_article or list_articles as alternatives, so there is clear context but no exclusion-based routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updatesv0.1.2
    • First observedget_article
    • First observedlist_articles
    • First observedsearch_articles

TDQS

A4.7/5.0

Scored across 3 tools

Disambiguation5/5

Each tool serves a distinct purpose: listing all articles, searching by keywords, and retrieving full content by slug. The descriptions clearly differentiate list from search, and both reference get_article for full reading, so an agent should not confuse them.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern: list_articles, search_articles, get_article. The pattern is predictable and makes the action and resource clear for each tool.

Tool Count5/5

Three tools is well-scoped for a read-only blog server. List, search, and get cover the essential discovery and retrieval workflow without unnecessary bloat or missing core functionality.

Completeness5/5

For a blog reading domain, the lifecycle is complete: discover articles via list or search, then read full content via get. There are no obvious gaps like missing tag browsing or full-text retrieval, as the existing tools handle these through filters and links.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers