YotoMCP Local
YotoMCP Local
A security-focused local Yoto MCP server using Yoto's official TypeScript SDK and the official OAuth Authorization Code + PKCE flow.
Security design
MCP stdio only; no HTTP listener is exposed.
The login callback binds only to
127.0.0.1and validates the OAuthstateand PKCE verifier.Tokens are stored locally with a 0700 directory and 0600 file; tools never return tokens.
Read-only tools are enabled by default.
Write operations require
YOTO_ENABLE_WRITES=true.Uploads additionally require
YOTO_AUDIO_ROOT, reject symlink escapes, accept only MP3/M4A files, and enforce a size limit.Presigned uploads require HTTPS, reject redirects, and never attach a Bearer token.
Multiple accounts are not supported, reducing accidental cross-account operations.
Available Tools
Tool name | Description |
| Start the local Yoto Authorization Code + PKCE login flow and return the browser URL. |
| Complete the pending PKCE login after the browser redirects to the local callback. |
| Show local authentication status and profile metadata without returning tokens. |
| Delete the locally stored Yoto token record without calling a remote API. |
| List the authenticated user's MYO cards. Read-only. |
| Retrieve one MYO card by ID. Read-only. |
| List linked Yoto players and their status. Does not control or modify devices. |
| Create an empty MYO card. Disabled by default; requires |
| Permanently delete an MYO card. Disabled by default; requires |
| Upload an MP3/M4A file from |
Build
Node 20+ is required. First create a Public Client in the Yoto Developer Dashboard and register:
http://127.0.0.1:8787/callback
npm install --ignore-scripts
npm run typecheck
npm run buildTest
Run the offline test suite and dependency audit:
npm run checkThe tests do not authenticate with Yoto or call the Yoto API. They cover safe configuration defaults, conditional write-tool exposure, delete confirmation, token-file permissions and removal, and audio path restrictions.
Run
YOTO_CLIENT_ID='your-public-client-id' node dist/index.jsAfter startup, call yoto_auth_start to receive the login URL. Complete login in the browser, then call yoto_auth_complete.
To enable writes and audio uploads:
YOTO_CLIENT_ID='your-public-client-id' \
YOTO_ENABLE_WRITES=true \
YOTO_AUDIO_ROOT="$HOME/YotoAudio" \
node dist/index.jsBefore production use, validate with a test account, test cards, and a dedicated audio directory. Never place a client secret, access token, or refresh token in configuration files, the repository, MCP messages, or logs.