Tuloy Tools
A private MCP server run by James Fouts at The Tuloy Lab. This page says what it does, how sign-in works and what it keeps.
- MCP endpoint
https://tools.tuloylab.com/mcp
- Protocol
- MCP 2026-07-28 over Streamable HTTP, with 2025-11-25 and older for clients that still use initialize.
- Sign-in
- OAuth 2.1 with PKCE. Metadata at
/.well-known/oauth-protected-resource/mcp.
What the tools do
Every tool result comes back as structured content that matches the output schema the tool declares, plus the same JSON as text.
memo_write
Save a text note on this server so any agent connected to it can find it later with memo_search. Notes are kept until the owner deletes them. Returns the new note id.
| Input | Type | |
|---|
text | string, required | The note to save, as plain text. |
| Result | Type | |
|---|
id | string, required | Id of the saved note. |
created_at | string | When the note was saved (UTC). |
memo_search
Find saved notes. Matches every word of the query, case-insensitive, newest first. An empty query returns the newest notes.
| Input | Type | |
|---|
query | string, required | Words or an exact code to look for. |
limit | integer | Most notes to return. |
| Result | Type | |
|---|
notes | array, required | |
upload
Store a file on this server and get back a public link to it. Anyone with the link can open the file, so do not upload secrets. Send the file bytes base64-encoded. Files up to 10 MB.
| Input | Type | |
|---|
filename | string, required | File name, for example clip.mp3. |
content_base64 | string, required | The file bytes, base64-encoded. A data: URL also works. |
content_type | string | MIME type, for example audio/mpeg. Guessed from the name when left out. |
| Result | Type | |
|---|
url | string, required | Public link to the file, served by this server. |
id | string | |
filename | string | |
content_type | string | |
bytes | integer | |
sha256 | string | |
transcribe
Turn speech in an audio file at a URL into timestamped text (Whisper large v3 turbo). Works with links from upload and with public http(s) links. Common formats such as mp3, wav, m4a, ogg and webm, up to 10 MB.
| Input | Type | |
|---|
url | string, required | Link to the audio file. |
language | string | Optional language code such as en. Detected when left out. |
| Result | Type | |
|---|
segments | array, required | |
text | string | The whole transcript. |
language | string | |
duration | number | Audio length in seconds. |
How sign-in works
- Only apps the owner lets in can use the tools. Every call to
/mcp needs a bearer access token from this server.
- An app finds the sign-in server through the protected resource metadata, then identifies itself with a Client ID Metadata Document URL. Older apps can register at
/register instead.
- The app sends the owner to a consent page here. It shows the app's name, its client id and where it returns to. The owner approves with a passphrase that only the owner knows.
- PKCE with S256 is required. Tokens are bound to
https://tools.tuloylab.com/mcp and are refused anywhere else.
- Access tokens last one hour. Refresh tokens last 30 days and change on every use, and reusing an old one cancels the whole grant.
- Codes and tokens are stored only as SHA-256 hashes. The owner can cancel any app's access, and apps can revoke their own tokens at
/revoke.
What data it keeps
| Data | What is stored | How long |
| Memos | The note text, the time and the name of the app that saved it. Every connected app can search them. | Until the owner deletes them |
| Uploaded files | The file, its name, type, size and checksum. Anyone with the link can open it. Links are random and long, so they are hard to guess, but they are not secret once shared. | Until the owner deletes them |
| Transcriptions | Nothing. Audio is fetched, sent to Cloudflare Workers AI (Whisper) and the text goes back to the caller. Neither is saved. | Not kept |
| Connected apps | App name, client id, return addresses, approval time, and hashed tokens. | Until revoked. Expired tokens are cleared after a day |
| Logs | Event lines with the tool name, the app name, sizes and timing. No note text, file contents or tokens. | Cloudflare log retention, a few days |
Limits
- Files and audio up to 10 MB. Notes up to 20,000 characters.
- 120 tool calls a minute per app, 100 uploads and 60 transcriptions an hour.
- The transcribe tool fetches only public http(s) addresses. It refuses local and private hosts.
Where it runs
A Cloudflare Worker with a Cloudflare D1 database. Transcription uses Cloudflare Workers AI. Nothing runs on a home machine.