blog-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@blog-mcpFind Rasmus's articles about parallel agents, then read the most relevant post."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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@latestOpen 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 |
| Optional | Newest posts first, optionally filtered by an exact case-insensitive tag |
|
| Keyword matches, with title and tag matches ranked higher |
|
| 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-runTests 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.jsOnly 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 toolsget_articleARead-onlyIdempotent
Read the full Markdown content and canonical link for an article. Supply the slug returned by list_articles or search_articles.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes |
TDQS
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.
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.
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.
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.
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.
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_articlesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | ||
| limit | No | ||
| offset | No |
TDQS
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.
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.
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.
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.
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.
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_articlesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| offset | No |
TDQS
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.
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.
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.
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.
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.
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.
3 tool updates
v0.1.2- First observed
get_article - First observed
list_articles - First observed
search_articles
TDQS
Scored across 3 tools
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.
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.
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.
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
Related MCP Connectors
Create, edit, organize, publish, and configure JustBlogged blogs from MCP clients.
Read-only access to MojaLab.com blog content: search and read posts, pages and tags as Markdown.
Hosted MCP for BlogBat: read, write, generate, and publish blog articles and content.
MCP gateway for donhuffines.com: articles, search and full text. Read-only, no auth.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceManage your Ghost blog content directly from Claude, Cursor, or any MCP-compatible client, allowing you to create, edit, search, and delete posts with support for tag management and analytics.8 npmMIT
- AlicenseNot gradedqualityCmaintenanceRead-only MCP server exposing the catalog of articles from moncompte.org. Enables AI agents to search and retrieve article content via tools.MIT
- FlicenseNot gradedqualityDmaintenanceEnables browsing Mofei's blog posts, fetching article details, comments, and recommendations via MCP tools.-
- FlicenseDqualityDmaintenanceMCP server for blog management that provides tools to get, search, and create blog posts via a mock API.3-