We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/doobidoo/mcp-memory-service'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>MCP Memory Service v10.20 — Persistent Memory for AI Agents</title>
<meta name="description" content="Self-hosted persistent memory for AI agents. Semantic search, knowledge graph, automatic consolidation. Now with Streamable HTTP + OAuth 2.1 for Claude.ai.">
<meta property="og:title" content="MCP Memory Service v10.20">
<meta property="og:description" content="Your self-hosted memory server now connects to Claude.ai. Streamable HTTP + OAuth 2.1 + PKCE.">
<meta property="og:type" content="website">
<style>
*,*::before,*::after{margin:0;padding:0;box-sizing:border-box}
:root{
--cyan:#00e5ff;--purple:#b388ff;--dark:#0a0e17;--card:#111827;
--text:#e2e8f0;--muted:#94a3b8;--glow:0 0 20px rgba(0,229,255,.3);
}
html{scroll-behavior:smooth}
body{background:var(--dark);color:var(--text);font-family:'Segoe UI',system-ui,-apple-system,sans-serif;overflow-x:hidden;line-height:1.6}
a{color:var(--cyan);text-decoration:none;transition:opacity .2s}
a:hover{opacity:.8}
/* Canvas background */
#bg-canvas{position:fixed;top:0;left:0;width:100%;height:100%;z-index:0;pointer-events:none}
/* Hero */
.hero{position:relative;z-index:1;min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:2rem}
.hero-logo{width:100px;height:100px;margin-bottom:1.5rem;border-radius:24px;animation:logo-glow 3s ease-in-out infinite;filter:drop-shadow(0 0 15px rgba(0,229,255,.4))}
@keyframes logo-glow{0%,100%{filter:drop-shadow(0 0 15px rgba(0,229,255,.4))}50%{filter:drop-shadow(0 0 30px rgba(179,136,255,.5))}}
.hero-badge{display:inline-block;padding:.4rem 1.2rem;border:1px solid var(--cyan);border-radius:999px;font-size:.85rem;color:var(--cyan);margin-bottom:1.5rem;letter-spacing:.05em;animation:pulse-border 2s ease-in-out infinite}
@keyframes pulse-border{0%,100%{border-color:var(--cyan);box-shadow:0 0 5px rgba(0,229,255,.2)}50%{border-color:var(--purple);box-shadow:0 0 15px rgba(179,136,255,.3)}}
.hero h1{font-size:clamp(2.5rem,6vw,4.5rem);font-weight:800;background:linear-gradient(135deg,var(--cyan),var(--purple));-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;margin-bottom:1rem}
.hero p{font-size:clamp(1.1rem,2.5vw,1.4rem);color:var(--muted);max-width:700px;margin-bottom:2.5rem}
.hero-buttons{display:flex;gap:1rem;flex-wrap:wrap;justify-content:center}
.btn{display:inline-flex;align-items:center;gap:.5rem;padding:.8rem 1.8rem;border-radius:8px;font-size:1rem;font-weight:600;transition:all .3s;cursor:pointer;border:none}
.btn-primary{background:linear-gradient(135deg,var(--cyan),var(--purple));color:var(--dark)}
.btn-primary:hover{box-shadow:var(--glow);transform:translateY(-2px)}
.btn-secondary{background:transparent;border:1px solid var(--muted);color:var(--text)}
.btn-secondary:hover{border-color:var(--cyan);color:var(--cyan)}
/* Scroll indicator */
.scroll-indicator{position:absolute;bottom:2rem;animation:bounce 2s infinite}
@keyframes bounce{0%,100%{transform:translateY(0)}50%{transform:translateY(10px)}}
.scroll-indicator svg{width:24px;height:24px;stroke:var(--muted);fill:none;stroke-width:2}
/* Section base */
section{position:relative;z-index:1;padding:6rem 2rem}
.container{max-width:1100px;margin:0 auto}
.section-title{font-size:clamp(1.8rem,4vw,2.5rem);font-weight:700;text-align:center;margin-bottom:1rem}
.section-subtitle{text-align:center;color:var(--muted);font-size:1.1rem;max-width:600px;margin:0 auto 3rem}
/* Feature cards */
.features-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:1.5rem}
.feature-card{background:var(--card);border:1px solid #1e293b;border-radius:16px;padding:2rem;transition:all .5s;opacity:0;transform:translateY(40px)}
.feature-card.visible{opacity:1;transform:translateY(0)}
.feature-card:hover{border-color:var(--cyan);box-shadow:0 0 30px rgba(0,229,255,.1);transform:translateY(-4px)}
.feature-icon{width:48px;height:48px;border-radius:12px;display:flex;align-items:center;justify-content:center;margin-bottom:1.2rem;font-size:1.5rem}
.feature-icon.http{background:linear-gradient(135deg,rgba(0,229,255,.2),rgba(0,229,255,.05))}
.feature-icon.oauth{background:linear-gradient(135deg,rgba(179,136,255,.2),rgba(179,136,255,.05))}
.feature-icon.privacy{background:linear-gradient(135deg,rgba(52,211,153,.2),rgba(52,211,153,.05))}
.feature-card h3{font-size:1.25rem;margin-bottom:.6rem}
.feature-card p{color:var(--muted);font-size:.95rem;line-height:1.7}
/* Architecture diagram */
.arch-section{background:linear-gradient(180deg,transparent,rgba(0,229,255,.02),transparent)}
.arch-diagram{display:flex;align-items:center;justify-content:center;gap:0;flex-wrap:wrap;padding:2rem 0}
.arch-node{background:var(--card);border:1px solid #1e293b;border-radius:12px;padding:1.2rem 1.5rem;text-align:center;min-width:160px;opacity:0;transform:scale(.8);transition:all .6s}
.arch-node.visible{opacity:1;transform:scale(1)}
.arch-node:hover{border-color:var(--purple);box-shadow:0 0 20px rgba(179,136,255,.15)}
.arch-node .label{font-size:.75rem;color:var(--muted);text-transform:uppercase;letter-spacing:.1em;margin-bottom:.3rem}
.arch-node .name{font-size:1.05rem;font-weight:600}
.arch-arrow{color:var(--cyan);font-size:1.5rem;padding:0 .5rem;opacity:0;transition:all .6s .3s}
.arch-arrow.visible{opacity:1}
.arch-arrow.data-flow{animation:flow 1.5s ease-in-out infinite}
@keyframes flow{0%,100%{opacity:.4}50%{opacity:1;text-shadow:0 0 10px var(--cyan)}}
.arch-labels{display:flex;justify-content:center;gap:2rem;margin-top:1.5rem;flex-wrap:wrap}
.arch-label{font-size:.8rem;color:var(--muted);display:flex;align-items:center;gap:.4rem}
.arch-label .dot{width:8px;height:8px;border-radius:50%}
.dot-cyan{background:var(--cyan)}
.dot-purple{background:var(--purple)}
/* Stats */
.stats-section{background:linear-gradient(180deg,transparent,rgba(179,136,255,.02),transparent)}
.stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:2rem}
.stat-card{text-align:center;padding:2rem;opacity:0;transform:translateY(30px);transition:all .5s}
.stat-card.visible{opacity:1;transform:translateY(0)}
.stat-number{font-size:clamp(2rem,5vw,3rem);font-weight:800;background:linear-gradient(135deg,var(--cyan),var(--purple));-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}
.stat-label{color:var(--muted);font-size:.9rem;margin-top:.3rem}
/* Install */
.install-section{text-align:center}
.install-box{background:var(--card);border:1px solid #1e293b;border-radius:12px;padding:1.5rem 2rem;display:inline-block;margin:1.5rem 0 2.5rem;font-family:'SF Mono',Consolas,'Liberation Mono',monospace;font-size:1.1rem;color:var(--cyan);position:relative;cursor:pointer;transition:all .3s}
.install-box:hover{border-color:var(--cyan);box-shadow:var(--glow)}
.install-box .copy-hint{position:absolute;top:-1.8rem;right:0;font-size:.75rem;color:var(--muted);font-family:system-ui,sans-serif;opacity:0;transition:opacity .2s}
.install-box:hover .copy-hint{opacity:1}
.install-box.copied{border-color:#34d399}
.install-box.copied::after{content:'Copied!';position:absolute;top:-1.8rem;right:0;font-size:.75rem;color:#34d399;font-family:system-ui,sans-serif}
.cta-buttons{display:flex;gap:1rem;justify-content:center;flex-wrap:wrap;margin-top:1rem}
/* Footer */
footer{position:relative;z-index:1;text-align:center;padding:3rem 2rem;color:var(--muted);font-size:.85rem;border-top:1px solid #1e293b}
footer a{color:var(--cyan)}
/* Mobile */
@media(max-width:640px){
.arch-diagram{flex-direction:column}
.arch-arrow{transform:rotate(90deg)}
.hero-buttons{flex-direction:column;align-items:center}
section{padding:4rem 1.5rem}
}
</style>
</head>
<body>
<canvas id="bg-canvas"></canvas>
<!-- Hero -->
<header class="hero">
<img src="brain-icon.png" alt="MCP Memory Service" class="hero-logo">
<span class="hero-badge">v10.20 — Now Available</span>
<h1>MCP Memory Service</h1>
<p>Persistent memory for AI agents. Semantic search, knowledge graph, automatic consolidation — now accessible from Claude.ai via Streamable HTTP.</p>
<div class="hero-buttons">
<a href="https://github.com/doobidoo/mcp-memory-service" class="btn btn-primary" target="_blank">
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z"/></svg>
GitHub
</a>
<a href="https://pypi.org/project/mcp-memory-service/" class="btn btn-secondary" target="_blank">
PyPI Package
</a>
</div>
<div class="scroll-indicator">
<svg viewBox="0 0 24 24"><polyline points="6 9 12 15 18 9"/></svg>
</div>
</header>
<!-- Features -->
<section id="features">
<div class="container">
<h2 class="section-title">What's New in v10.20</h2>
<p class="section-subtitle">Claude.ai can now connect to your self-hosted memory server. Your knowledge, your data, your server.</p>
<div class="features-grid">
<div class="feature-card" data-delay="0">
<div class="feature-icon http">⚡</div>
<h3>Streamable HTTP Transport</h3>
<p>New <code>--streamable-http</code> CLI flag. One command and your memory server is remotely accessible from Claude.ai. Fully separate from SSE — existing setups are unaffected.</p>
</div>
<div class="feature-card" data-delay="150">
<div class="feature-icon oauth">🔒</div>
<h3>OAuth 2.1 + PKCE</h3>
<p>S256 Proof Key for Code Exchange across all storage backends. Bearer token auth on <code>/mcp</code>, API key-gated authorization, RFC 9728 discovery. The secure auth flow Claude.ai expects.</p>
</div>
<div class="feature-card" data-delay="300">
<div class="feature-icon privacy">🛡</div>
<h3>Self-Hosted & Privacy-First</h3>
<p>Run on your VPS, your cloud, your hardware. Zero data leaves your infrastructure. Open source under Apache 2.0. Full control over your AI agent's memory.</p>
</div>
</div>
</div>
</section>
<!-- Architecture -->
<section class="arch-section" id="architecture">
<div class="container">
<h2 class="section-title">How It Works</h2>
<p class="section-subtitle">Claude.ai connects to your memory server through Streamable HTTP with OAuth 2.1 authentication.</p>
<div class="arch-diagram">
<div class="arch-node" data-delay="0">
<div class="label">Browser</div>
<div class="name">Claude.ai</div>
</div>
<div class="arch-arrow data-flow">→</div>
<div class="arch-node" data-delay="200">
<div class="label">Transport</div>
<div class="name">Streamable HTTP</div>
</div>
<div class="arch-arrow data-flow">→</div>
<div class="arch-node" data-delay="400">
<div class="label">Auth</div>
<div class="name">OAuth 2.1 + PKCE</div>
</div>
<div class="arch-arrow data-flow">→</div>
<div class="arch-node" data-delay="600">
<div class="label">Server</div>
<div class="name">MCP Memory</div>
</div>
<div class="arch-arrow data-flow">→</div>
<div class="arch-node" data-delay="800">
<div class="label">Storage</div>
<div class="name">Knowledge Graph</div>
</div>
</div>
<div class="arch-labels">
<span class="arch-label"><span class="dot dot-cyan"></span> Data flow</span>
<span class="arch-label"><span class="dot dot-purple"></span> Auth boundary</span>
</div>
</div>
</section>
<!-- Stats -->
<section class="stats-section" id="stats">
<div class="container">
<h2 class="section-title">Built for Production</h2>
<p class="section-subtitle">Battle-tested with comprehensive testing and optimized for performance.</p>
<div class="stats-grid">
<div class="stat-card" data-delay="0">
<div class="stat-number" data-target="1267">0</div>
<div class="stat-label">Tests</div>
</div>
<div class="stat-card" data-delay="100">
<div class="stat-number" data-target="13" data-suffix="+">0</div>
<div class="stat-label">AI Apps Supported</div>
</div>
<div class="stat-card" data-delay="200">
<div class="stat-number" data-target="5" data-suffix="ms">0</div>
<div class="stat-label">Read Latency</div>
</div>
<div class="stat-card" data-delay="300">
<div class="stat-number" data-target="534628" data-suffix="x">0</div>
<div class="stat-label">Cache Speedup</div>
</div>
</div>
</div>
</section>
<!-- Install / CTA -->
<section class="install-section" id="install">
<div class="container">
<h2 class="section-title">Get Started in Seconds</h2>
<p class="section-subtitle">Install from PyPI and connect your AI agents to persistent memory.</p>
<div class="install-box" onclick="copyInstall(this)">
<span class="copy-hint">Click to copy</span>
pip install mcp-memory-service
</div>
<div class="cta-buttons">
<a href="https://github.com/doobidoo/mcp-memory-service" class="btn btn-primary" target="_blank">
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z"/></svg>
View on GitHub
</a>
<a href="https://github.com/doobidoo/mcp-memory-service/wiki" class="btn btn-secondary" target="_blank">
Documentation
</a>
<a href="https://github.com/doobidoo/mcp-memory-service/releases/tag/v10.20.1" class="btn btn-secondary" target="_blank">
Release Notes
</a>
</div>
</div>
</section>
<footer>
<p>MCP Memory Service — Open Source under Apache 2.0 — <a href="https://github.com/doobidoo/mcp-memory-service">github.com/doobidoo/mcp-memory-service</a></p>
</footer>
<script>
// ---- Particle Network Background ----
const canvas = document.getElementById('bg-canvas');
const ctx = canvas.getContext('2d');
let particles = [];
const PARTICLE_COUNT = 80;
const CONNECT_DIST = 150;
let mouse = { x: -1000, y: -1000 };
function resize() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
}
window.addEventListener('resize', resize);
resize();
document.addEventListener('mousemove', e => { mouse.x = e.clientX; mouse.y = e.clientY; });
class Particle {
constructor() {
this.x = Math.random() * canvas.width;
this.y = Math.random() * canvas.height;
this.vx = (Math.random() - 0.5) * 0.5;
this.vy = (Math.random() - 0.5) * 0.5;
this.r = Math.random() * 2 + 1;
this.cyan = Math.random() > 0.5;
}
update() {
this.x += this.vx;
this.y += this.vy;
if (this.x < 0 || this.x > canvas.width) this.vx *= -1;
if (this.y < 0 || this.y > canvas.height) this.vy *= -1;
// subtle mouse repulsion
const dx = this.x - mouse.x, dy = this.y - mouse.y;
const dist = Math.sqrt(dx * dx + dy * dy);
if (dist < 120) {
this.vx += dx / dist * 0.15;
this.vy += dy / dist * 0.15;
}
// dampen
this.vx *= 0.99;
this.vy *= 0.99;
}
draw() {
ctx.beginPath();
ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2);
ctx.fillStyle = this.cyan ? 'rgba(0,229,255,0.6)' : 'rgba(179,136,255,0.6)';
ctx.fill();
}
}
for (let i = 0; i < PARTICLE_COUNT; i++) particles.push(new Particle());
function animate() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
for (let i = 0; i < particles.length; i++) {
particles[i].update();
particles[i].draw();
for (let j = i + 1; j < particles.length; j++) {
const dx = particles[i].x - particles[j].x;
const dy = particles[i].y - particles[j].y;
const dist = Math.sqrt(dx * dx + dy * dy);
if (dist < CONNECT_DIST) {
const opacity = (1 - dist / CONNECT_DIST) * 0.15;
ctx.beginPath();
ctx.moveTo(particles[i].x, particles[i].y);
ctx.lineTo(particles[j].x, particles[j].y);
ctx.strokeStyle = particles[i].cyan
? `rgba(0,229,255,${opacity})`
: `rgba(179,136,255,${opacity})`;
ctx.lineWidth = 0.5;
ctx.stroke();
}
}
}
requestAnimationFrame(animate);
}
animate();
// ---- Scroll Animations ----
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const delay = parseInt(entry.target.dataset.delay || '0');
setTimeout(() => entry.target.classList.add('visible'), delay);
observer.unobserve(entry.target);
}
});
}, { threshold: 0.15 });
document.querySelectorAll('.feature-card, .arch-node, .arch-arrow, .stat-card').forEach(el => observer.observe(el));
// ---- Counter Animation ----
const counterObserver = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const el = entry.target;
const target = parseInt(el.dataset.target);
const suffix = el.dataset.suffix || '';
const duration = 2000;
const start = performance.now();
function tick(now) {
const elapsed = now - start;
const progress = Math.min(elapsed / duration, 1);
// ease out cubic
const eased = 1 - Math.pow(1 - progress, 3);
const current = Math.floor(eased * target);
el.textContent = current.toLocaleString() + suffix;
if (progress < 1) requestAnimationFrame(tick);
}
requestAnimationFrame(tick);
counterObserver.unobserve(el);
}
});
}, { threshold: 0.5 });
document.querySelectorAll('.stat-number[data-target]').forEach(el => counterObserver.observe(el));
// ---- Copy Install ----
function copyInstall(el) {
navigator.clipboard.writeText('pip install mcp-memory-service');
el.classList.add('copied');
setTimeout(() => el.classList.remove('copied'), 2000);
}
</script>
</body>
</html>