MCP Server
ToolPiper is an MCP server — 440 tools and 5 resources that give AI agents local inference, speech, vision and OCR, RAG, image generation and editing, video creation and generation, AX-powered browser automation, web scraping, PiperTest execution, outreach, SERP research, macOS system control, scheduling, and autonomous agent loops. Everything runs on-device.
Install
One command. All 440 tools are callable immediately, and the advertisement stays cheap: the wire ships tool names with schemas stripped to {type: object} except where typed parameters are genuinely needed, and an agent pulls full documentation on demand with tool_search and tool_docs. Add ?category= or ?profile= to the URL to advertise only a subset.
Claude CodeHTTP transportclaude mcp add --transport http toolpiper http://127.0.0.1:9998/mcpZero-config on loopback
A local connection to 127.0.0.1 needs no token and no consent — connection-level trust for a single-user machine. Only LAN and remote peers authenticate with a bearer.
No CLI middleman
Tools dispatch over HTTP to 127.0.0.1:9998. No ~/.toolpiper/mcp stdio binary in your path.
Per-tool permissions
Allow / Ask / Deny per tool lives in ToolPiper → Settings → Tool Permissions and travels with you, not the client. Remote bearer clients are listed in Connected Apps.
Other Clients
ToolPiper speaks MCP over Streamable HTTP. Any client that supports HTTP transport can connect to http://127.0.0.1:9998/mcp — Claude Code, Cursor, Devin, Codex, Gemini CLI, Cline. If a client offers a legacy "SSE" transport option, always pick Streamable HTTP instead.
Cursor / Devin / Gemini CLI
The same server entry works in each client's MCP config — ~/.cursor/mcp.json for Cursor, mcp_config.json for Devin, settings.json for Gemini CLI:
{
"mcpServers": {
"toolpiper": {
"type": "http",
"url": "http://127.0.0.1:9998/mcp"
}
}
}Tool-count caps are handled for you
Some clients silently drop tools past a limit — Cursor at roughly 40, Devin at 100. ToolPiper recognises those clients and narrows the advertised set to fit: tools you explicitly allowed rank first, one slot is reserved for request_tools, and everything withheld stays reachable through it on demand. Narrowing, not truncation — a client we don't recognise gets the full catalog.
Scripted use
Sessions are created by initialize and carried in the Mcp-Session-Id header. On loopback no auth header is needed; from another machine (LAN/mesh) add Authorization: Bearer with the token from ~/Library/Application Support/ToolPiper/.toolpiper-token:
SESSION=$(curl -si -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"script","version":"1.0"}}}' \
http://127.0.0.1:9998/mcp | tr -d '\r' | grep -i '^mcp-session-id:' | cut -d' ' -f2)
curl -H "Content-Type: application/json" -H "Mcp-Session-Id: $SESSION" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \
http://127.0.0.1:9998/mcpTools 440
Every row below derives from the same catalog the server advertises. Tool names are unprefixed — the MCP server namespace (toolpiper) provides branding and collision avoidance. Read-only tools advertise readOnlyHint and destructive tools advertise destructiveHint.
Core
33audio_transcriberead-onlyTranscribe an audio file (WAV, MP3, M4A, FLAC) to text using on-device speech recognition.chatread-onlyRun a prompt through a local LLM on this machine via ToolPiper.claude_code_installInstall the bundled claude-tp helper so the user can run `claude-tp` in their terminal to launch Claude Code with ToolPiper as the inference backend and ToolPiper's MCP tools mounted.claude_code_statusread-onlyRead-only diagnostic for the claude-tp helper installed by claude_code_install.claude_code_uninstallReverse claude_code_install: removes the ~/.local/bin/claude-tp symlink, deletes the helper's config file, and revokes the inference bearer.endpoint_listread-onlyList ToolPiper inference endpoints (LLM providers + models).endpoint_recommendSuggest the best inference backend for the current conversation.endpoint_setSwitch the inference backend ToolPiper uses.endpoint_statusread-onlyShow the currently active inference backend for the caller.model_checkpoint_addRegister the user's own pinned HuggingFace weights against a coded native media architecture family and start the download.model_downloadStart downloading (or registering) a model, LoRA, VAE, or embedding from any source.model_download_cancelCancel an in-flight model download by its download_id (from model_download_list or the response of model_download).model_download_listread-onlyList active model downloads with their progress and download_id values.model_listread-onlyList AI models available in ToolPiper.model_loadLoad a model that is already downloaded into memory for inference.model_repo_inforead-onlyFetch metadata, the full file list, a recommended variant, and (for community sources) the license and trigger words for a specific candidate.model_searchread-onlyFind a model, LoRA, VAE, or embedding by free-text query across a source.model_unloadUnload a model from memory to free RAM/VRAM.system_resourcesread-onlyGet a live snapshot of Mac hardware resources — total/used/available RAM, GPU memory (Metal allocated + max, device utilization), GPU thermal state (nominal, fair, serious, critical), ANE activity (which backends are using the Neural Engine), and chip info (name, memory bandwidth).system_statusread-onlyCheck if ToolPiper is running and get system status — loaded models, active backends, GPU thermal state, available RAM, and browser CDP connection state (connected, pageUrl).text_embedread-onlyGenerate vector embeddings for text, entirely on-device.text_translateread-onlyTranslate text between languages using Apple's on-device Translation framework.tool_docsread-onlyGet the full description and typed input schema for named tools.tool_searchread-onlyFind the right tools for a task by describing what you want to do in natural language.vision_camera_captureread-onlyCapture a single still frame from the Mac's webcam and return it as a base64-encoded PNG (≤1280 px on the longest edge).voice_chat_memory_addStore a persistent fact about the user that voice chat can reference in future sessions.voice_chat_memory_clearWipe all persistent facts stored via voice_chat_memory_add.voice_chat_session_resetClear the active voice chat conversation history.voice_chat_settings_getread-onlyRead the current voice chat configuration — endpointConfigId, TTS voice, TTS speed, tools-enabled flag, and session timeout.voice_chat_settings_setUpdate one or more voice chat configuration fields.Analysis
51Browser
30Custom Chrome DevTools Protocol engine. Playwright MCP and chrome-devtools MCP weren't cutting it.
role:button:Sign In, role:form:Login > role:button:Submitbrowser_connectOwn the Chrome CDP connection lifecycle.browser_consoleread-onlyGet browser console messages (log, warn, error) and optionally network request logs.browser_detectread-onlyDetect the frontend framework, meta-framework, CMS, state libraries, router, and dev/prod mode on the current page.browser_locatorread-onlyGiven an element on the current page, return the canonical, ranked set of stable accessibility selectors to use in saved tests.browser_page_listread-onlyList the open Chrome tabs the CDP debugger sees, with each tab's id, URL, and title.browser_pdfRender the current browser page to a PDF file and return its path as a resource link.browser_recordRecord user interactions as action events (clicks, fills, navigations) for test creation — not screen video (use video_record for that).browser_snapshotread-onlyGet a structural snapshot of the current browser page via Chrome's accessibility engine.browser_storagedestructiveRead and write browser storage: cookies, localStorage, sessionStorage.browser_viewport_resizeSet the viewport width and height for the active Chrome tab, and optionally the device pixel ratio it renders at.browser_webmcpDiscover and invoke WebMCP tools that the current page exposes.http_requestMake a raw HTTP request to any URL — returns the HTTP status code, response headers, and raw response body (JSON, text, or bytes).http_request_replayread-onlyReplay a discovered API endpoint with optional parameter overrides.web_api_discoverread-onlyPassively analyze already-captured browser network traffic to discover API endpoints.Filesystem
24archive_listread-onlyList entries inside a zip / tar / tar.gz archive without extracting.file_copyCopy a file or a directory tree to a new path, creating missing parent directories.file_editReplace an exact, unique span of text in an existing file — the surgical alternative to rewriting the whole file with file_write.file_list_directoryread-onlyList a directory under `entries` (name, path, type, size, mtime epoch-seconds, is_symlink, kind UTI).file_pick_directoryread-onlyOpen a native macOS file/folder picker dialog and return the selected path with isDirectory flag.system_run_commanddestructiveExecute a shell command and stream stdout/stderr in real time.workspace_addGrant the agent access to a directory this session by pinning it to the workspace access list.Capture
6Testing
6test_getread-onlyGet a full PiperTest by ID with all steps, AX paths, element metadata, and execution context.test_listread-onlyList saved PiperTests with metadata (id, name, step count, last run status).Motion
5Outreach
18Search
3Sieve
4System
181Video
68Video Tools
7OAuth
4Resources 5
Read-only data the AI can pull into context without calling a tool.
toolpiper://statusServer health, version, loaded models, system resourcestoolpiper://modelsFull model catalog with availability and categoriestoolpiper://backendsBackend status — which engines are running and their capabilitiestoolpiper://testsSaved PiperTests with metadatatoolpiper://categoriesTool categories, counts, and profiles for filtering tools/listHow It Works
AI Client (Claude Code, Cursor, Devin, Codex, Gemini CLI, Cline, etc.)
↓ JSON-RPC over Streamable HTTP — POST 127.0.0.1:9998/mcp [?category= | ?profile=]
ToolPiper.app (macOS, running)
↓ in-process dispatch — route() direct, no socket round-trip
Backends (llama.cpp, FluidAudio, MLX Audio, Apple Intelligence, Vision, NLP, Pose, CDP, System Actions)Auth
Loopback connections (127.0.0.1) are trusted at the connection level — no token, no consent sheet, zero config for every local MCP client. LAN, mesh, and remote peers authenticate with Authorization: Bearer (pre-issued at ~/Library/Application Support/ToolPiper/.toolpiper-token) and appear in ToolPiper → Settings → Connected Apps. Sessions are tracked via the Mcp-Session-Id header.
Errors
If ToolPiper isn't running, the MCP endpoint is unreachable and the AI client surfaces a connection error pointing back at modelpiper.com/download. ToolPiper's own errors (auth, model not loaded, permission denied) come back as isError: true tool results with the message attached verbatim.
Stuck on “Needs authentication”?
A loopback connection to 127.0.0.1:9998 is auto-trusted and never needs OAuth. If your client still shows “Needs authentication” — typically after updating ToolPiper while a session was open — it has cached a stale auth state that restarting the client won't clear. Remove and re-add the server: run claude mcp remove toolpiper -s local, then claude mcp add --transport http toolpiper http://127.0.0.1:9998/mcp. It reconnects immediately. Don't click “Authenticate” — on a loopback connection that opens an OAuth page you don't need.
On-demand discovery
Every tools/list carries a reserved request_tools meta-tool: an agent that needs a capability outside its current tool list describes it ("read a PDF") and gets back the matching tools' full callable schemas. In-catalog, tool_search finds tools by task and tool_docs returns full typed schemas by name. For clients with tool-count caps (Cursor ~40, Devin 100), ToolPiper narrows the advertised set to fit and keeps the remainder reachable through the hatch — narrowing, not truncation.
Annotations
Every tool is classified. Read-only tools advertise readOnlyHint and destructive tools advertise destructiveHint, so an AI client can tell a file read from a file delete before it decides what to run without asking. Each hint is sent only when true, which is exactly how MCP defines the defaults, so an absent hint reads as false rather than as unknown.
Context economics
The advertised catalog ships tool names with input schemas stripped to {type: object}; typed schemas ride the wire only where parameters can't be inferred from name and context. Connecting with ?category= or ?profile= trims both the tool set and the server's teaching instructions to the matching sections. ToolPiper's own chat surfaces go further: PiperMatch, an on-device retrieval model, picks the relevant tool subset per turn.
Permissions
Per-tool gating (Allow / Ask / Deny) lives in ToolPiper → Settings → Tool Permissions and travels with the user, not the client. Denied tools are stripped from the advertisement and refused at dispatch. A tool set to Ask is advertised with destructiveHint so a conforming client confirms with you before running it.
Federation
ToolPiper is also an MCP client: connected servers' tools are surfaced alongside the native catalog under namespaced ids. Install VisionPiper and its screen-capture control plane appears as mcp__visionpiper__* — one connection for your agent, every piper app behind it.
Live updates
Open GET /mcp with Accept: text/event-stream and the session id to receive notifications/tools/list_changed when the catalog shifts — a model loads, a license changes, a federated server connects. Clients that don't subscribe simply poll tools/list.
Prompts
5 workflow templates available via prompts/list: setup-model, audit-page, create-test, voice-over, research-topic. Each returns step-by-step instructions with the right tool sequence.
Structured output
54 tools declare an outputSchema and return structuredContent (machine-readable JSON) alongside human-readable text — text_embed, vision_ocr, model_list, rag_query, audio_speak, image_upscale, and the file and Git families among them.