{
  "source_file": "0930",
  "source_platform": "Substack",
  "author": "Alex Ewerlöf Notes\nAlex Ewerlöf",
  "title_listed": "RAG vs Skill vs MCP vs RLM: A Comparison",
  "keywords": "RAG, MCP, Skill, RLM, Agent能力扩展, 工具调用",
  "domain": "大模型算法",
  "content_type": "对比分析",
  "is_paid_flag": "免费",
  "url": "https://blog.alexewerlof.com/p/rag-vs-skill-vs-mcp-vs-rlm",
  "publish_date": "2025",
  "corpus_stage": "RAG/Agent",
  "notes": "清晰对比RAG/Skill/MCP/RLM四种LLM能力扩展方式的优劣与适用场景",
  "id": "e18395573a3b",
  "collected_at": "2026-10-01T20:25:10",
  "title": "RAG vs SKILL vs MCP vs RLM - Alex Ewerlöf Notes",
  "body_markdown": "LLMs are generalists. Regardless if they’re foundation models, instruct models or thinking models, there’s a limit to what they can do in terms of specialized work.\nFoundation vs. Instruct vs. Thinking Models\nAlex Ewerlöf\n·\nDecember 24, 2025\nRead full story\nHow do we work around that limitation and turn a generalist LLM to a reliable specialist for a given set of tasks?\nRAG and RLM virtually expand the context window while SKILL and MCP enable external tool access.\nThis post describes each technique, implementation/usage mechanics, cons/pros, and tips on when to use or avoid it.\nDisclosure: some AI is used in the early research and draft stage of this this page, but I’ve gone through everything multiple times and edited heavily to ensure that it represents my own thoughts and experience.\nSubscribe\n1. RAG\nRetrieval-Augmented Generation\nAt its core, RAG is the AI equivalent of\nJust-In-Time (JIT) dependency injection\n. LLM’s weights are static after training. What if we want to add proprietary or up to date information to it?\nRAG introduces an external lookup mechanism that executes\nbefore\nthe user prompt is submitted to the model. The goal is to dynamically append highly relevant, specialized knowledge directly into the execution context.\nImplementing RAG\nBefore RAG can be used, the knowledge base must be prepared and indexed into a searchable format.\nIngestion:\nRaw domain data (documents, wikis, logs) is collected and parsed.\nChunking:\nText is split into smaller, semantically meaningful segments to fit within embedding and context window limits.\nEmbedding:\nAn embedding model converts the text chunks into high-dimensional vector representations (basically a numerical array).\nStorage:\nThe vectors and their corresponding text chunks are saved in a vector database for rapid similarity search like\nSQLite-Vector\n,\nPostgress pgvector\n,\nPinecone\nor just a simple array that’s loaded from JSON.\nUsing RAG\nWhen a user interacts with the system, the pre-built vector database is queried to inject context dynamically.\nRetrieval:\nThe user’s query is intercepted and converted into a vector using\nthe same\nembedding model.\nSearch:\nThe system performs a similarity search (e.g.,\ncosine similarity\n) in the vector database to find the most relevant chunks.\nInjection:\nThe retrieved text is prepended or appended to the user’s prompt as context.\nGeneration:\nThe LLM processes the augmented prompt to generate an informed response.\nPros and Cons of RAG\nPros:\nConceptually simple. Decoupled from model implementation details. Strictly bounds the LLM to provided facts (reducing hallucinations). Heavily adopted with mature tooling. Requires zero model fine-tuning. RAG data and vector DB can be updated without touching LLM.\nCons:\nHighly dependent on the quality of the embedding model and chunking strategy. Lexical or semantic mismatch can cause silent retrieval failures. vector DB introduces additional infrastructure overhead and state management complexities.\nRAG Use case\nUse RAG for\nwhen you need to query static or slowly changing knowledge bases (like corporate wikis, documentation, or historical logs) where the volume of data exceeds the LLM context window but fits well within a search paradigm.\nDon’t use RAG for\nreal-time transactional data, tasks requiring complex multi-step reasoning over the entire dataset, or when the specialized logic is behavioral rather than informational.\nNote: if the size of the dataset is small, you can skip the embedding and vector DB by directly including it to the system prompt. This method is called CAG (Cache-Augmented Retrieval) but due to simplicity and limited application I didn’t include it in the list.\nSee also\nPageIndex\n: a different approach to RAG which skips the embedding mechanism altogether and instead provides a table of context for the agent to navigate\nGraphRAG\n: from Microsoft research, another approach where a knowledge graph maps the relation between different chunks of information (as opposed to the simplest form of RAG which we discussed).\n2. SKILL\nDynamic Capability Loading\nIf RAG is like\nJust-In-Time dependency injection\n, SKILL operates like\nDynamic Link Libraries (DLLs)\n.\nSKILL reverses the RAG flow: instead of a rigid vector search blindly injecting data, the LLM itself decides what capabilities it needs to acquire based on the context of the conversation.\nThis also eliminates the need for the embedding model and vector DB, making it much easier to use.\nImplementing SKILL\nSME (subject matter experts) must first define the skills, write the deterministic code, and iteratively evaluate the LLM’s routing behavior before deployment.\nDefinition:\nEngineers write clear, concise descriptions of specific capabilities (e.g., “Financial Calculator”, “User Authentication Manager”).\nScripting:\nDeterministic code scripts (e.g., Node.js or Python functions) are written to handle tasks that LLMs are bad at, like math or precise string formatting.\nEvaluation (Eval Loop):\nThe skill is tested against a “golden dataset” of test queries. The evaluation framework checks if the LLM correctly routes to the new skill and if the tool returns the expected output. Failures trigger refinements to the skill description or the underlying scripts.\nRegistration:\nOnce the skill passes the evaluation threshold, the skill descriptions, manuals, and executable scripts are registered in a central Skill Registry (e.g.\nAnthropic’s\n) accessible to the AI applications.\nUsing SKILL\nEach\nSKILL has\nhas a\nname\nand\ndescription\nfield.\nCapability Broadcasting:\nThe system prompt is injected with a lightweight list of available skill summaries (their\nname\nand\ndescription\n).\nEvaluation:\nThe LLM evaluates the user prompt against its known capabilities.\nRetrieval:\nIf needed, the LLM requests to load the specific full skill manual or script it requires to solve the problem.\nAugmentation & Tooling:\nThe system loads the requested skill. Optionally, the LLM makes\ntool calls\nbased on the deterministic scripts offered by the skill (the orchestrator executes those calls).\nExecution:\nThe LLM uses the results of the tool execution and the newly loaded context to formulate a highly specialized answer.\nPros and Cons of SKILL\nPros:\nDrastically reduces token usage by only loading what is needed. Utilizes the LLM’s superior reasoning for routing rather than relying on dumb embedding model and vector similarity. Allows mixing stochastic reasoning with deterministic script execution (excellent for math or rigid logic).\nCons:\nIntroduces multi-turn latency before the user gets an answer. Requires a highly capable reasoning model to correctly identify which skill to load.\nSKILL Use case\nUse SKILL for\nagentic workflows where the LLM has access to hundreds of potential tools, but loading all tool definitions would bloat the context window or confuse the model (the limit is around 50 tools after which LLM has difficulty loading relevant skills). It is particularly effective for offloading math or deterministic routing to simple scripts.\nDon’t use SKILL for\nsimple Q&A bots, low-latency synchronous APIs, or when using smaller, less capable models that struggle with multi-step gradual capability enhancement.\nSee also\nnpx skills\n: a CLI that pairs with\nskills.sh\nto find and download skills off the internet directly to your machine.\nSkill specification\n: from Anthropic. They also have a “marketplace” for skills called\nAwesome Skills\n. Here’s\nanother listing\n. And\nyet another one\n. Or\nthis one\nor\nthat one\n. As you can see there’s no shortage of these skill directories. 😄\nSubscribe\n3. MCP\nModel Context Protocol\nMCP is the\nPOSIX standard or API Gateway for AI\n. Originally created to standardize how LLMs interact with external software (browsers, IDEs, databases, SaaS), MCP defines a strict client-server architecture. It exposes three core primitives:\nPrompts\n: reusable prompt templates✳️\nTools\n: executable functions✳️\nResources\n: contextual data and files\n✳️ You may notice that MCP has\nprompt\nand\ntools\nin common with SKILLS. Although MCP was originally introduced as a translation layer, many MCPs are self-contained, composed of a prompt and tool. For those cases\nit’s better to use SKILLs\n.\nImplementing MCP\nThe MCP server acts as an integration layer that must be configured to talk to external systems and rigorously tested for translation accuracy.\nServer Setup:\nAn MCP server instance is provisioned on the network or locally. This can be as simple as a docker container or even an\nnpx\ncommand.\nConfiguration:\nEngineers define the Resources (e.g., file paths, database schemas) and Tools (e.g., API POST requests) the server will expose.\nAuthentication & Routing:\nThe server is configured with the necessary\ncredentials\nand network routes to securely communicate with the target external systems.\nMCP server\nacts as an\nOAuth 2.1 resource server\nand\nMCP client\nacts as an\nOAuth 2.1 client\n.\nIntegration Evaluation (Eval Loop):\nAutomated test suites prompt an LLM to interact with the newly configured MCP server. The Eval framework validates that the LLM correctly discovers tools, forms valid JSON-RPC requests, and that the target API responds accurately without unintended state changes.\nUsing MCP\nThe LLM client establishes a standardized connection to interact with the environment.\nDiscovery:\nThe\nLLM client\n(not the raw LLM) connects to the MCP server and queries its available Prompts, Resources, and Tools via standardized\nJSON-RPC\n.\nIntegration:\nThe LLM reads a Resource (e.g., pulling a GitHub issue) or invokes a Tool (e.g., triggering a build pipeline). The LLM client makes the call.\nTranslation:\nThe MCP server translates the standardized LLM JSON-RPC request into the proprietary API calls of the target software.\nCallback:\nThe external software executes the action and returns the result through the MCP server back to the LLM Client which will be handed to the LLM.\nPros and Cons of MCP\nPros:\nDecouples the LLM from the target API. Allows write-once, use-anywhere tool creation (an MCP server works with Claude, local tools, or custom interfaces alike).\nCons:\nArchitecture can be heavy and rigid. As noted, self-contained MCPs often bundle too much context upfront, making them less efficient than the dynamic loading of SKILLs. LLM Client and Server (which sit between the LLM and an API) add to the system complexity. More complexity generally means more risk for things going wrong and less reliability.\nMCP Use case\nUse MCP for\nconnecting LLMs to complex, stateful external systems (databases, SaaS platforms, local filesystems) where standardization, security, and reusability across different AI clients are a hard requirement.\nDon’t use MCP for\ninternal, tightly-coupled micro-agent interactions or self-contained tasks where the dynamic, lightweight nature of SKILL is more performant and cost-effective.\nSee also\nWebMCP\nproposes two new APIs that allow browser agents to take action on behalf of the user:\nDeclarative API:\nPerform standard actions that can be defined directly in HTML forms.\nImperative API:\nPerform complex, more dynamic interactions that require JavaScript execution.\nChrome\nDevTools MCP\n) is one of my favorites because it gives the agent “eyes” to see the result of its code and debug front-end code.\nJust like skills, there’s no shortage of MCP marketplaces and directories like\nthis one\n,\nthat one\nor\nthis other one\n.\nUsing CLI instead of the standard JSON\n: I just saw this on the day of publication (which shows how rapidly this space is evolving) and the core idea is to give CLI access to LLMs instead of the MCP standard.\nSkills vs Dynamic MCP Loadouts\n: good write up on why self-contained MCP is an anti-pattern and we should use Skills instead.\n4. RLM\nRecursive Language Models\nIf SKILL operates like\nDLLs\n, RLM is like\nFFI (foreign function interface)\n.\nRLM is the newest architectural evolution, functioning similarly to\nMapReduce combined with a recursive REPL (\nRead-Eval-Print Loop\n)\nlike the one you find in\nPython\nor\nNode.js\n.\nIts primary goal is to entirely bypass the physical constraints of the LLM context window. Instead of trying to stuff a massive prompt into the model, RLM treats the long prompt as an\nexternal environment variable\n.\nImplementing RLM\nBecause RLM executes code recursively against massive datasets, a secure execution environment must be prepared.\nEnvironment Provisioning:\nA sandboxed REPL environment (e.g., a Docker container or\nFirecracker microVM\n) is set up with necessary runtimes (Python, Node.js, etc.).\nData Staging:\nThe massive dataset (e.g., an entire repository or gigabytes of legal documents) is staged on a fast local filesystem.\nVariable Mounting:\nThe dataset is mounted into the REPL environment as an accessible global variable or directory structure.\nUsing RLM\nThe LLM is given access into the secure environment to recursively explore the data.\nScaffolding:\nThe system prompt contains instructions explaining the REPL environment, its capabilities, and the overarching goal.\nProgrammatic Peeking:\nThe LLM\nwrites code\nto peek into, search, or slice the massive variable mounted in the environment.\nRecursive Invocation:\nThe LLM writes programs that recursively spawn new instances of\nitself\nto process the sliced snippets of the prompt/data in parallel.\nAggregation:\nThe recursive calls collapse back up the stack, aggregating findings, and the final state/variable is returned to the user.\nPros and Cons of RLM\nPros:\nUnblocks processing of virtually infinite context sizes. Drastically improves accuracy on large datasets compared to simple chunk-and-search RAG. Allows the LLM to dynamically determine its own data traversal strategy.\nCons:\nNon-deterministic execution paths can lead to infinite recursion or runaway API costs; highly complex to observe and debug; latency is extremely high due to multiple sequential and parallel LLM invocations.\nRLM Use case\nUse RLM for\nmassive, complex reasoning tasks that require global context comprehension—such as refactoring an entire monorepo, analyzing a 10,000-page legal discovery dump, Epstin Files, or finding deeply buried logic bugs in large datasets where standard RAG vector searches fail to capture structural nuance.\nDon’t use RLM for\nany synchronous, user-facing chat applications, simple text summarization, or environments where strict cost controls and low latency are required.\nIf you found this post insightful pls share it in your circles and on social media to inspire others.\nShare\nMy monetization strategy\nis to give away most content for free but these posts take anywhere from a few hours to a few days to draft, edit, research, illustrate, and publish. I pull these hours from my private time, vacation days and weekends. The simplest way to support this work is to\nlike\n,\nsubscribe\nand\nshare\nit. If you really want to support me lifting our community, you can consider a paid subscription. If you want to save, you can get 20% off via\nthis link\n. As a token of appreciation, subscribers get full access to the Pro-Tips sections and my online book\nReliability Engineering Mindset\n. Your contribution also funds my open-source products like\nService Level Calculator\n. You can also\ninvite your friends\nto gain free access.\nAnd to those of you who already support me:\nthank you\nfor sponsoring this content for others. 🙌 If you have questions or feedback, or want me to dig deeper into something, please let me know in the comments.\nFurther reading\nSkills vs Dynamic MCP Loadouts\n, Armin Ronacher, 2025-12-13\nRLM: The Ultimate Evolution of AI? Recursive Language Models\n, Gao Dalie, 2026-01-13",
  "metadata": {
    "title": "RAG vs SKILL vs MCP vs RLM - Alex Ewerlöf Notes",
    "description": "Comparing various techniques to make the models more reliable while working around context window limitation",
    "keywords": null,
    "author": "Alex Ewerlöf",
    "og:type": "article",
    "og:title": "RAG vs SKILL vs MCP vs RLM",
    "og:description": "Comparing various techniques to make the models more reliable while working around context window limitation",
    "og:image": "https://substackcdn.com/image/fetch/$s_!4oAM!,w_1200,h_675,c_fill,f_jpg,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31d1990f-c32f-483e-a90e-5bb6460a03dd_1212x643.png",
    "og:url": "https://blog.alexewerlof.com/p/rag-vs-skill-vs-mcp-vs-rlm",
    "twitter:title": "RAG vs SKILL vs MCP vs RLM",
    "twitter:description": "Comparing various techniques to make the models more reliable while working around context window limitation",
    "twitter:image": "https://substackcdn.com/image/fetch/$s_!t0xH!,f_auto,q_auto:best,fl_progressive:steep/https%3A%2F%2Falexewerlof.substack.com%2Fapi%2Fv1%2Fpost_preview%2F188590418%2Ftwitter.jpg%3Fversion%3D4",
    "twitter:card": "summary_large_image",
    "article:modified_time": "2026-03-20T12:02:28.208Z"
  },
  "paywall": {
    "listed_paid": false,
    "detected": false,
    "marker": "",
    "public_only": false,
    "policy": "付费/会员内容只保留页面公开可见部分，不绕过付费墙"
  },
  "crawl": {
    "success": true,
    "status_code": 200,
    "error": ""
  },
  "code_blocks": [],
  "images": [
    {
      "status": "ok",
      "url": "https://substackcdn.com/image/fetch/$s_!3VHU!,w_140,h_140,c_fill,f_auto,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7e21469-e53a-439e-8984-67b1d33c4068_3584x1184.png",
      "bytes": 5681,
      "reused": false,
      "local_path": "attachments/e18395573a3b/images/body-e9476338b0f1de511da9.png",
      "src": "https://substackcdn.com/image/fetch/$s_!3VHU!,w_140,h_140,c_fill,f_auto,q_auto:good,fl_progressive:steep,g_auto/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7e21469-e53a-439e-8984-67b1d33c4068_3584x1184.png",
      "alt": "Foundation vs. Instruct vs. Thinking Models",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://substackcdn.com/image/fetch/$s_!4oAM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31d1990f-c32f-483e-a90e-5bb6460a03dd_1212x643.png",
      "bytes": 22671,
      "reused": false,
      "local_path": "attachments/e18395573a3b/images/body-41b2bb0724b54ace5689.png",
      "src": "https://substackcdn.com/image/fetch/$s_!4oAM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31d1990f-c32f-483e-a90e-5bb6460a03dd_1212x643.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://substackcdn.com/image/fetch/$s_!Hu1l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9324a1d2-5a33-4804-b9e8-c4d863543346_1153x707.png",
      "bytes": 26165,
      "reused": false,
      "local_path": "attachments/e18395573a3b/images/body-d25f83fcb5da8b68a79b.png",
      "src": "https://substackcdn.com/image/fetch/$s_!Hu1l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9324a1d2-5a33-4804-b9e8-c4d863543346_1153x707.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://substackcdn.com/image/fetch/$s_!S6Nr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a44efdb-98e4-4d1e-8f21-fdaff594c76f_1221x743.png",
      "bytes": 81902,
      "reused": false,
      "local_path": "attachments/e18395573a3b/images/body-e7dccc9225d44cdf5add.png",
      "src": "https://substackcdn.com/image/fetch/$s_!S6Nr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a44efdb-98e4-4d1e-8f21-fdaff594c76f_1221x743.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://substackcdn.com/image/fetch/$s_!8qyz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F989bd25b-a532-4ae8-b7eb-4abeee26ca75_1199x897.png",
      "bytes": 76074,
      "reused": false,
      "local_path": "attachments/e18395573a3b/images/body-07c18f30ad93bde7c641.png",
      "src": "https://substackcdn.com/image/fetch/$s_!8qyz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F989bd25b-a532-4ae8-b7eb-4abeee26ca75_1199x897.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://substackcdn.com/image/fetch/$s_!1YlA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25e058f6-05ab-4d4f-abd6-2a6a8826c37e_1239x740.png",
      "bytes": 89337,
      "reused": false,
      "local_path": "attachments/e18395573a3b/images/body-de0bd1946671ba650f3e.png",
      "src": "https://substackcdn.com/image/fetch/$s_!1YlA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25e058f6-05ab-4d4f-abd6-2a6a8826c37e_1239x740.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://substackcdn.com/image/fetch/$s_!-Jz6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0926ccb3-75bc-4a05-9dbb-2b5882b68477_1228x706.png",
      "bytes": 26201,
      "reused": false,
      "local_path": "attachments/e18395573a3b/images/body-6615bdf5f37a63a0da50.png",
      "src": "https://substackcdn.com/image/fetch/$s_!-Jz6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0926ccb3-75bc-4a05-9dbb-2b5882b68477_1228x706.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://substackcdn.com/image/fetch/$s_!dFUA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73bb6863-a00d-447d-ac09-c65d7aeca2d0_1201x535.png",
      "bytes": 19845,
      "reused": false,
      "local_path": "attachments/e18395573a3b/images/body-5f4e3babf104816c59a7.png",
      "src": "https://substackcdn.com/image/fetch/$s_!dFUA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73bb6863-a00d-447d-ac09-c65d7aeca2d0_1201x535.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://substackcdn.com/image/fetch/$s_!jEwg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39f91154-ae84-4e35-979e-fef33e4809bd_1212x676.png",
      "bytes": 56723,
      "reused": false,
      "local_path": "attachments/e18395573a3b/images/body-437d1dcc062bb18527bc.png",
      "src": "https://substackcdn.com/image/fetch/$s_!jEwg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39f91154-ae84-4e35-979e-fef33e4809bd_1212x676.png",
      "alt": "",
      "downloaded": true
    }
  ],
  "audio": [],
  "videos": [],
  "links": [
    {
      "href": "https://blog.alexewerlof.com/p/base-models-vs-instruct-models",
      "label": "Foundation vs. Instruct vs. Thinking Models Alex Ewerlöf · December 24, 2025 Read full story",
      "type": "a"
    },
    {
      "href": "https://substack.com/profile/87732486-alex-ewerlof",
      "label": "Alex Ewerlöf",
      "type": "a"
    },
    {
      "href": "https://github.com/sqliteai/sqlite-vector",
      "label": "SQLite-Vector",
      "type": "a"
    },
    {
      "href": "https://github.com/pgvector/pgvector",
      "label": "Postgress pgvector",
      "type": "a"
    },
    {
      "href": "https://www.pinecone.io/",
      "label": "Pinecone",
      "type": "a"
    },
    {
      "href": "https://substackcdn.com/image/fetch/$s_!4oAM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31d1990f-c32f-483e-a90e-5bb6460a03dd_1212x643.png",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://en.wikipedia.org/wiki/Cosine_similarity",
      "label": "cosine similarity",
      "type": "a"
    },
    {
      "href": "https://substackcdn.com/image/fetch/$s_!Hu1l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9324a1d2-5a33-4804-b9e8-c4d863543346_1153x707.png",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://github.com/VectifyAI/PageIndex",
      "label": "PageIndex",
      "type": "a"
    },
    {
      "href": "https://microsoft.github.io/graphrag/",
      "label": "GraphRAG",
      "type": "a"
    },
    {
      "href": "https://agentskills.io/",
      "label": "Dynamic Capability Loading",
      "type": "a"
    },
    {
      "href": "https://github.com/anthropics/skills",
      "label": "Anthropic’s",
      "type": "a"
    },
    {
      "href": "https://substackcdn.com/image/fetch/$s_!S6Nr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a44efdb-98e4-4d1e-8f21-fdaff594c76f_1221x743.png",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://support.claude.com/en/articles/12512198-how-to-create-custom-skills",
      "label": "SKILL has",
      "type": "a"
    },
    {
      "href": "https://substackcdn.com/image/fetch/$s_!8qyz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F989bd25b-a532-4ae8-b7eb-4abeee26ca75_1199x897.png",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://github.com/vercel-labs/skills",
      "label": "npx skills",
      "type": "a"
    },
    {
      "href": "https://skills.sh/",
      "label": "skills.sh",
      "type": "a"
    },
    {
      "href": "https://awesomeclaude.ai/awesome-claude-skills",
      "label": "Awesome Skills",
      "type": "a"
    },
    {
      "href": "https://awesomeskill.ai/",
      "label": "another listing",
      "type": "a"
    },
    {
      "href": "https://www.awesomeskills.dev/en",
      "label": "yet another one",
      "type": "a"
    },
    {
      "href": "https://awesome-skills.app/",
      "label": "this one",
      "type": "a"
    },
    {
      "href": "https://github.com/ComposioHQ/awesome-claude-skills",
      "label": "that one",
      "type": "a"
    },
    {
      "href": "https://modelcontextprotocol.io/",
      "label": "Model Context Protocol",
      "type": "a"
    },
    {
      "href": "https://lucumr.pocoo.org/2025/12/13/skills-vs-mcp/",
      "label": "it’s better to use SKILLs",
      "type": "a"
    },
    {
      "href": "https://docs.npmjs.com/cli/v8/commands/npx",
      "label": "npx",
      "type": "a"
    },
    {
      "href": "https://modelcontextprotocol.io/specification/draft/basic/authorization",
      "label": "credentials",
      "type": "a"
    },
    {
      "href": "https://www.ietf.org/archive/id/draft-ietf-oauth-v2-1-13.html",
      "label": "OAuth 2.1 resource server",
      "type": "a"
    },
    {
      "href": "https://substackcdn.com/image/fetch/$s_!1YlA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25e058f6-05ab-4d4f-abd6-2a6a8826c37e_1239x740.png",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://en.wikipedia.org/wiki/JSON-RPC",
      "label": "JSON-RPC",
      "type": "a"
    },
    {
      "href": "https://substackcdn.com/image/fetch/$s_!-Jz6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0926ccb3-75bc-4a05-9dbb-2b5882b68477_1228x706.png",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://developer.chrome.com/blog/chrome-devtools-mcp",
      "label": "WebMCP",
      "type": "a"
    },
    {
      "href": "https://mcpservers.org/",
      "label": "this one",
      "type": "a"
    },
    {
      "href": "https://github.com/punkpeye/awesome-mcp-servers",
      "label": "that one",
      "type": "a"
    },
    {
      "href": "https://mcp.so/",
      "label": "this other one",
      "type": "a"
    },
    {
      "href": "https://kanyilmaz.me/2026/02/23/cli-vs-mcp.html",
      "label": "Using CLI instead of the standard JSON",
      "type": "a"
    },
    {
      "href": "https://arxiv.org/abs/2512.24601",
      "label": "Recursive Language Models",
      "type": "a"
    },
    {
      "href": "https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop",
      "label": "Read-Eval-Print Loop",
      "type": "a"
    },
    {
      "href": "https://realpython.com/python-repl/",
      "label": "Python",
      "type": "a"
    },
    {
      "href": "https://nodejs.org/api/repl.html",
      "label": "Node.js",
      "type": "a"
    },
    {
      "href": "https://firecracker-microvm.github.io/",
      "label": "Firecracker microVM",
      "type": "a"
    },
    {
      "href": "https://substackcdn.com/image/fetch/$s_!dFUA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73bb6863-a00d-447d-ac09-c65d7aeca2d0_1201x535.png",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://substackcdn.com/image/fetch/$s_!jEwg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F39f91154-ae84-4e35-979e-fef33e4809bd_1212x676.png",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://blog.alexewerlof.com/p/rag-vs-skill-vs-mcp-vs-rlm?utm_source=substack&utm_medium=email&utm_content=share&action=share",
      "label": "Share",
      "type": "a"
    },
    {
      "href": "https://blog.alexewerlof.com/p/faq",
      "label": "My monetization strategy",
      "type": "a"
    },
    {
      "href": "https://blog.alexewerlof.com/protipsdiscount",
      "label": "this link",
      "type": "a"
    },
    {
      "href": "https://blog.alexewerlof.com/p/rem",
      "label": "Reliability Engineering Mindset",
      "type": "a"
    },
    {
      "href": "https://slc.alexewerlof.com/",
      "label": "Service Level Calculator",
      "type": "a"
    },
    {
      "href": "https://blog.alexewerlof.com/leaderboard",
      "label": "invite your friends",
      "type": "a"
    },
    {
      "href": "https://dev.to/gaodalie_ai/rlm-the-ultimate-evolution-of-ai-recursive-language-models-3h8o",
      "label": "RLM: The Ultimate Evolution of AI? Recursive Language Models",
      "type": "a"
    }
  ],
  "repair_version": 2,
  "repaired_at": "2026-10-14T10:47:15Z",
  "source_url": "https://blog.alexewerlof.com/p/rag-vs-skill-vs-mcp-vs-rlm",
  "papers": [
    {
      "status": "ok",
      "url": "https://arxiv.org/pdf/2512.24601",
      "bytes": 9942446,
      "reused": false,
      "local_path": "papers/repair/7368a08484d58101c810.pdf"
    }
  ],
  "actual_video_files": [],
  "body_chars": 15568,
  "expected_body_images": 9,
  "discovery_status": "ok",
  "delivery_status": "ok",
  "missing_reason": "",
  "raw_html": "attachments/e18395573a3b/pages/source.html",
  "local_html": "attachments/e18395573a3b/pages/article.html",
  "body_base_path": "attachments/e18395573a3b/pages/",
  "body_markdown_path": "attachments/e18395573a3b/pages/article.md"
}