Todd Sundsted<p>I've been running <a href="https://github.com/toddsundsted/ktistec/releases/tag/v3.0.0" rel="nofollow noopener" target="_blank">v3.0.0</a> of Ktistec in production for the last few weeks, and it seems stable and I’m using it every day, so it’s time to release it!</p><p>This release adds:</p><ul><li><strong>Model Context Protocol (MCP) support.</strong> Ktistec can act as an MCP Server.</li><li><strong>OAuth2 authentication support.</strong> Ktistec can act as both an OAuth2 authentication server and a resource server.</li></ul><p><a href="https://modelcontextprotocol.io/" rel="nofollow noopener" target="_blank">Model Context Protocol</a> (MCP) is a simple, general API that exposes Ktistec ActivityPub collections (timeline, notifications, likes, announces, etc.) to MCP clients. To be fully transparent about what this means, <em>MCP clients</em> are shells for <em>Large Language Models (LLMs)</em>.</p><p>When building this, I focused on a few use cases that are important to me: content summarization, content prioritization (or filtering) based on my <em>interests</em> or the <em>content's structure</em> (well-constructed arguments vs. low-signal opinions) or <em>its tone</em>, especially when it comes to <em>shared posts</em>. Ktistec is a <em>single user</em> ActivityPub server and Epiktistes (my instance) gets a lot of traffic. I want to build the “algorithms” that surface the content <em>I want to see</em>.</p><p>Of note, there’s currently <strong>no support for content generation</strong>.</p><p>While I work on this, I’m not abandoning the 2.x line. I’ll continue to add compatible features and fix bugs as long as I'm able. I realize the use of LLMs, and MCP by extension, and therefore the 3.x branch, is controversial—I don’t intend to push v3 on anyone.</p><p>If you're still with me, Ktistec now exposes:</p><ul><li>MCP Resources<ul><li>ActivityPub actors (<code>ktistec://actors/{id*}</code>)</li><li>ActivityPub objects (<code>ktistec://objects/{id*}</code>)</li><li>registered users (<code>ktistec://users/{id}</code>)</li><li>server information (<code>ktistec://information</code>)</li></ul></li><li>Tools<ul><li><code>count_collection_since(name, since)</code></li><li><code>paginate_collection(name, page, size)</code></li><li><code>read_resources(uris)</code></li></ul></li><li>Prompts<ul><li><code>whats_new</code></li></ul></li></ul><p>Supported collections include:</p><ul><li>timeline, notifications, posts, drafts, likes, announces, followers, following</li><li>collections of hashtags of the form <code>hashtag#<name></code> (e.g., "hashtag#technology")</li><li>collections of mentions of the form <code>mention@<name></code> (e.g., "mention@euripides")</li></ul><p>There is more detail in the README.</p><p>TL;DR Add a <em>remote MCP connector</em> in your MCP client of choice: supply the URL of your instance including the /mcp path (e.g. "https://epiktistes.com/mcp").<br></p>Screenshot of the MCP Inspector connected to Epiktistes<p><br><a href="https://epiktistes.com/tags/ktistec" class="hashtag" rel="nofollow noopener" target="_blank">#ktistec</a> <a href="https://epiktistes.com/tags/fediverse" class="hashtag" rel="nofollow noopener" target="_blank">#fediverse</a> <a href="https://epiktistes.com/tags/activitypub" class="hashtag" rel="nofollow noopener" target="_blank">#activitypub</a> <a href="https://epiktistes.com/tags/crystallang" class="hashtag" rel="nofollow noopener" target="_blank">#crystallang</a> <a href="https://epiktistes.com/tags/mcp" class="hashtag" rel="nofollow noopener" target="_blank">#mcp</a> <a href="https://epiktistes.com/tags/llm" class="hashtag" rel="nofollow noopener" target="_blank">#llm</a></p>