Memo MCP server: plan

A private Model Context Protocol server at https://mcp.sdet.it/mcp. It speaks MCP 2026-07-28 (stateless Streamable HTTP) and also accepts 2025-11-25 clients that use the initialize handshake. Only clients the owner approves can use it.

Tools

ToolInputResultWhat it does
memo_write{ text }{ id, created_at }Saves a text note (max 100 000 characters).
memo_search{ query?, limit? }{ notes: [{ id, text, created_at }] }Case-insensitive search: a note matches if it contains the whole query or every word of it. Empty query returns all notes. Newest first, default limit 100.
upload{ filename, content_base64, content_type? }{ url, id, filename, size, content_type }Stores a file (max 20 MB decoded) and returns a link under https://mcp.sdet.it/files/… that anyone with the link can open without signing in. Filenames are reduced to A-Z a-z 0-9 . _ -. Images, audio, PDF and plain text open in the browser; everything else downloads as an attachment.
transcribe{ url }{ segments: [{ start, end, text }], language? }Downloads audio or video from a public http(s) URL (max 50 MB, 60 s download limit; private and internal network addresses are refused), converts it with ffmpeg and transcribes it on this server with whisper.cpp (multilingual base model, language auto-detected). start/end are seconds.

Every result is returned as structuredContent matching the tool's declared outputSchema, plus the same JSON as text. Problems (bad input, failed download) come back as tool results with isError: true.

How sign-in works

  1. A client calls https://mcp.sdet.it/mcp without a token and gets 401 with a WWW-Authenticate header pointing to the protected resource metadata (https://mcp.sdet.it/.well-known/oauth-protected-resource/mcp).
  2. That metadata names this same host as the OAuth 2.1 authorization server (https://mcp.sdet.it/.well-known/oauth-authorization-server).
  3. The client identifies itself with a Client ID Metadata Document (an https URL as client_id; preferred) or registers through Dynamic Client Registration at https://mcp.sdet.it/register (kept for older clients).
  4. The owner opens the authorization link. The page shows the client's name and where it will redirect. Access is granted only when the owner types the owner passphrase and presses Allow; Deny returns access_denied. Wrong passphrases are rate-limited.
  5. The client exchanges the one-time code (valid 60 s) using PKCE S256 and the resource parameter https://mcp.sdet.it/mcp. It receives an access token (valid 60 minutes) bound to that resource, and a refresh token (valid 30 days, rotated on every use).

Tokens issued for any other resource are rejected. The only scope is mcp, which covers all four tools.

What data it keeps

DataKept?How long
Notes (text, id, creation time)Yes, in a file on this serverUntil deleted on request
Uploaded files (bytes, sanitized name, type, size, upload time)Yes, on this server's disk, publicly readable by linkUntil deleted on request
Audio sent to transcribeOnly in a temporary folder while it is processedDeleted as soon as the call ends
TranscriptsNo. Returned to the caller onlyNot stored
Registered OAuth clients (client id, name, redirect URIs, hashed secret)YesUntil deleted on request
Access and refresh tokensOnly as SHA-256 hashes, with client id, audience and expiryRemoved after they expire or are revoked
Request log (time, method, path without query, status, duration, JSON-RPC method and tool name, client IP)Yes, in the server's standard output. Tokens, passphrases, note text and file contents are never loggedAs long as the host keeps container logs

Deletion and contact

To delete notes, files, a client registration or tokens, contact darek@sdet.it and give the note ids, file links or client id. A client can also revoke its own tokens at https://mcp.sdet.it/revoke (RFC 7009).