ToolPiper API
ToolPiper is the local AI server that powers ModelPiper. It runs on your Mac, manages inference engines, and exposes an OpenAI-compatible API at localhost:9998.
http://localhost:9998/v1SpecGET /v1/openapi.jsonHow It Works
ModelPiper is the web app you're looking at right now. It talks to ToolPiper, a native macOS app running in the background. ToolPiper manages the actual AI engines — llama.cpp for LLMs, FluidAudio for speech, CoreML for images, and more.
When you create a Provider in ModelPiper, you're setting up a configuration that pairs an AI model with a specific engine. For example: Use the Llama 3.2 3B model via llama.cpp or Use Parakeet for speech-to-text via FluidAudio. Each provider becomes a usable endpoint on the ToolPiper API.
ModelPiper uses an internal session key to stay connected to ToolPiper — you don't need to think about that. But if you want to build your own app on top of ToolPiper, you'll need a Developer Token.
Developer Tokens Pro
A dev token lets you use ToolPiper from your own code, just like an OpenAI API key. Create one, drop it into any OpenAI-compatible SDK, and point the base URL at localhost:9998/v1. That's it.
Claude Code Zero-config
Wire ToolPiper into Claude Code with one click. We generate a dev token, write ~/.claude/settings.json, and register ToolPiper as an MCP server. Claude Code's /model picker shows every endpoint you've configured here.
New to all of this? See the comparison vs Ollama / vLLM / LM Studio.
Anthropic Proxy Backend Phase 1 plumbing
ToolPiper will expose POST /v1/messages as an Anthropic-shape proxy so Claude Code (and any Anthropic-compatible client) can use any provider you've configured. Pick the global backend below, or bind a specific provider per token in the table above.
Quick Start
Drop-in replacement for the OpenAI SDK — just change the base URL and API key. Questions? @ModelPiper on X.
curl http://localhost:9998/v1/chat/completions \
-H "Authorization: Bearer tp_YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"model": "llama-3.2-3b",
"messages": [{"role": "user", "content": "Hello!"}]
}'MCP Server 147 tools
ToolPiper is also an MCP server. Install categories individually to control which tools your AI client sees — saves context tokens.
core12LLM inference, TTS, STT, embeddings, OCRanalysis8Image/text analysis, RAG, upscalingbrowser19Browser automation, scraping, assertionstesting6PiperTest CRUD and executionmotion5Pose estimation, stream processingoutreach12GitHub, HN, Reddit, X, content queuesystem29macOS system actionsvideo17Video creator pipelineoauth4OAuth connection managementsieve4MediaPiper sieve cache inspectionfilesystem13File read/write, git operations, shell commands
See MCP docs for install commands, profiles, and full tool reference.
Endpoints
Inference
OpenAI-compatible chat completions and model listing
- GET
/v1/modelsList available models - POST
/v1/chat/completionsCreate chat completion (streaming supported)
Audio
Speech-to-text and text-to-speech
- POST
/v1/audio/transcriptionsTranscribe audio (STT) - POST
/v1/audio/speechSynthesize speech (TTS), supports voice cloning
Image & Video
CoreML-powered image and video upscaling (PiperSR)
- POST
/v1/images/upscaleUpscale image 2x/4x via CoreML (returns PNG) - POST
/v1/video/upscaleUpscale video 2x via PiperSR (base64 in/out) - POST
/v1/video/upscale/urlUpscale video 2x from URL - POST
/v1/video/upscale/fileUpscale video 2x using file paths (no base64 overhead) - GET
/v1/video/upscale/{id}Check upscale job status - GET
/v1/video/upscale/{id}/resultDownload upscaled video result (streaming) - POST
/v1/benchmark/upscaleRun PiperSR benchmark suite (A–G)
Pose Estimation
Body keypoint detection for ControlNet, AnimateDiff, DWPose
- POST
/v1/pose/detectDetect body poses — skeleton image + JSON keypoints - POST
/v1/pose/activateActivate a pose detection model - GET
/v1/pose/activeGet currently active pose detector - GET
/v1/pose/formatsList backends, renderers, and topologies - GET
/v1/pose/modelsAvailable pose detection models - POST
/v1/pose/stream/startStart the pose streaming WebSocket (on-demand, returns port) - POST
/v1/pose/stream/stopStop the pose streaming WebSocket - GET
/v1/pose/stream/statusCheck if pose stream WebSocket is running + port
Stream Processing
Real-time frame processing from WebSocket sources
- POST
/v1/stream/startStart stream session (connect to frame source) - POST
/v1/stream/stopStop a stream session - GET
/v1/stream/statusActive sessions and frame stats
RAG
Retrieval-Augmented Generation
- GET
/v1/rag/collectionsList collections - POST
/v1/rag/collectionsCreate a collection - GET
/v1/rag/collections/{id}Get collection details - PUT
/v1/rag/collections/{id}Update a collection - DELETE
/v1/rag/collections/{id}Delete a collection - GET
/v1/rag/collections/{id}/chunksList chunks (paginated) - POST
/v1/rag/collections/{id}/ingestStart document ingestion - GET
/v1/rag/collections/{id}/ingest/statusIngestion progress - POST
/v1/rag/collections/{id}/ingest/cancelCancel ingestion - POST
/v1/rag/querySemantic search across collections - POST
/v1/rag/browse-folderBrowse folder for ingestion
Cloud Proxy
Keychain-backed cloud API proxy
- POST
/v1/cloud/proxyProxy request to cloud provider - POST
/v1/cloud/api-keySave API key to Keychain - GET
/v1/cloud/api-keyLoad API key from Keychain - DELETE
/v1/cloud/api-keyDelete API key from Keychain
Models
Model management and HuggingFace integration
- GET
/model-configsList curated model presets - POST
/model-configs/installInstall a model by preset ID - GET
/modelsList downloaded models - GET
/models/{id}Get model details - DELETE
/models/{id}Delete a downloaded model - GET
/models/storageDisk usage for models - POST
/models/scanScan filesystem for new models - GET
/models/searchSearch HuggingFace - POST
/models/downloadDownload from HuggingFace - GET
/models/downloadsList active downloads - DELETE
/models/downloads/{id}Cancel a download - GET
/models/hf/{owner}/{repo}/filesList HuggingFace repo files
Engine
Inference engine control
- GET
/engine/statusEngine and backend status - POST
/engine/loadLoad a model - POST
/engine/unloadUnload a model or stop engine - GET
/models/statePer-model runtime states
Auth
Developer tokens (Pro)
- GET
/v1/tokensList dev tokens (masked) - POST
/v1/tokensCreate a dev token - PATCH
/v1/tokens/{id}Update token label, origins, or endpoint binding - DELETE
/v1/tokens/{id}Revoke a dev token
Anthropic Proxy
Settings for the Anthropic Messages proxy at /v1/messages
- GET
/v1/settings/anthropic-proxyRead global Anthropic proxy settings - PATCH
/v1/settings/anthropic-proxyUpdate global proxy backend selection
Apple Vision
On-device image analysis via Apple Vision framework
- POST
/v1/apple/ocrText recognition (20+ languages, handwriting) - GET
/v1/apple/ocr/languagesList supported OCR languages - POST
/v1/apple/barcodeBarcode and QR code detection - POST
/v1/apple/classifyImage classification (1000+ categories) - POST
/v1/apple/face-detectFace detection with pose angles - POST
/v1/apple/saliencyAttention or objectness saliency maps - POST
/v1/apple/rectanglesRectangle and document detection - POST
/v1/apple/feature-printImage feature vectors for similarity - POST
/v1/apple/body-poseHuman body skeletal keypoints - POST
/v1/apple/hand-poseHand and finger joint detection - POST
/v1/apple/animalsCat and dog detection - POST
/v1/apple/horizonHorizon angle detection - POST
/v1/apple/documentDocument boundary detection
Apple NLP
On-device text analysis via Apple Natural Language framework
- POST
/v1/apple/nlp/languageLanguage detection with confidence scores - POST
/v1/apple/nlp/sentimentSentiment analysis (-1 to +1) - POST
/v1/apple/nlp/entitiesNamed entity recognition (people, places, orgs) - POST
/v1/apple/nlp/tokenizeText tokenization (word, sentence, paragraph) - POST
/v1/apple/nlp/lemmatizeWord lemmatization (running → run) - POST
/v1/apple/nlp/posPart-of-speech tagging
Scrape
CDP-based web scraping with framework-aware readiness — up to 7 output formats from a single page load
- POST
/v1/scrapeStart a scrape job (markdown, text, readability, axTree, html, links, screenshot) - GET
/v1/scrapeList recent scrape jobs - GET
/v1/scrape/{jobId}Get scrape job status and result - GET
/v1/youtube/transcriptGet YouTube video transcript (captions)
Browser (CDP)
Chrome DevTools Protocol automation — AX selectors, self-healing, mutation diffing
- GET
/v1/browser/statusConnection status and current page - GET
/v1/browser/full-statusExtended status with pages and channels - GET
/v1/browser/channelsAvailable Chrome channels (dev, canary, stable) - POST
/v1/browser/connectConnect to Chrome (host + port) - POST
/v1/browser/disconnectDisconnect from Chrome - GET
/v1/browser/pagesList available browser pages - POST
/v1/browser/select-pageSwitch to a page by ID - POST
/v1/browser/new-tabOpen a new tab - POST
/v1/browser/close-tabClose a tab - GET
/v1/browser/snapshotAccessibility tree of current page - GET
/v1/browser/screenshotScreenshot as base64 PNG - POST
/v1/browser/actionPerform action (click, fill, navigate, etc.) - POST
/v1/browser/assertAssert page state (visible, text, url, etc.) - POST
/v1/browser/healHeal a broken selector - POST
/v1/browser/evaluateExecute JavaScript in page - POST
/v1/browser/resizeResize browser viewport - POST
/v1/browser/dialogHandle JavaScript dialogs - GET
/v1/browser/consoleRecent console messages (last 100) - POST
/v1/browser/record/startStart recording user interactions - POST
/v1/browser/record/stopStop recording, return action log - GET
/v1/browser/record/streamSSE stream of live recorded actions - GET
/v1/browser/networkList captured network requests - GET
/v1/browser/network/statusNetwork logging status - POST
/v1/browser/network/enableEnable network logging - POST
/v1/browser/network/disableDisable network logging - DELETE
/v1/browser/networkClear network log - GET
/v1/browser/network/{requestId}/bodyGet request/response body - GET
/v1/browser/storageGet cookies, localStorage, sessionStorage - DELETE
/v1/browser/storageClear browser storage - POST
/v1/browser/storage/cookieSet a cookie - POST
/v1/browser/storage/localSet localStorage value - POST
/v1/browser/storage/sessionSet sessionStorage value - POST
/v1/browser/trace/startStart performance trace - POST
/v1/browser/trace/stopStop performance trace - GET
/v1/browser/trace/statusTrace status - GET
/v1/browser/metricsGet performance metrics - GET
/v1/browser/coverage/statusCode coverage status - POST
/v1/browser/coverage/startStart JS/CSS code coverage - POST
/v1/browser/coverage/stopStop coverage collection - GET
/v1/browser/intercept/statusRequest interception status - POST
/v1/browser/intercept/enableEnable request interception - POST
/v1/browser/intercept/disableDisable request interception - GET
/v1/browser/mocksList mock rules - POST
/v1/browser/mocksCreate mock rule - DELETE
/v1/browser/mocksClear all mock rules - DELETE
/v1/browser/mocks/{id}Delete a mock rule - GET
/v1/browser/webauthn/statusWebAuthn authenticator status - POST
/v1/browser/webauthn/enableEnable virtual authenticator - POST
/v1/browser/webauthn/disableDisable virtual authenticator - GET
/v1/browser/webauthn/credentialsList WebAuthn credentials - DELETE
/v1/browser/webauthn/credentials/{id}Delete a WebAuthn credential - POST
/v1/browser/webauthn/verifySet credential as verified - POST
/v1/browser/autofill/credit-cardSet credit card autofill data - POST
/v1/browser/autofill/addressSet address autofill data
Testing (PiperTest)
Visual test session management, execution, and coverage
- GET
/v1/test-sessionsList all test sessions - POST
/v1/test-sessionsCreate a test session - POST
/v1/test-sessions/importImport a test session - GET
/v1/test-sessions/{id}Get test session by ID - PUT
/v1/test-sessions/{id}Update a test session - DELETE
/v1/test-sessions/{id}Delete a test session - POST
/v1/test-sessions/{id}/runRun a saved test session - POST
/v1/test-sessions/{id}/run/cancelCancel a running test - GET
/v1/test-sessions/{id}/probeGet saved interaction map - POST
/v1/test-sessions/{id}/coverageGet combined coverage report - POST
/v1/test-sessions/{id}/exportExport to Playwright/Cypress - POST
/v1/tests/runRun inline test steps - POST
/v1/browser/probe/scanScan page for interaction coverage
Video Creator
Screenplays, recording, rendering, and narration
- GET
/v1/video/screenplaysList screenplays - POST
/v1/video/screenplaysCreate a screenplay - GET
/v1/video/screenplays/{id}Get screenplay details - PUT
/v1/video/screenplays/{id}Update a screenplay - DELETE
/v1/video/screenplays/{id}Delete a screenplay - GET
/v1/video/screenplays/{id}/storyboardGet screenplay storyboard - POST
/v1/video/screenplays/{id}/rehearseDry-run a screenplay - POST
/v1/video/screenplays/{id}/recordRecord screenplay to video - POST
/v1/video/screenplays/{id}/record/cancelCancel recording - POST
/v1/video/screenplays/{id}/renderRender with styling/overlays - POST
/v1/video/screenplays/{id}/render/cancelCancel rendering - POST
/v1/video/screenplays/{id}/narrateGenerate TTS narration - POST
/v1/video/screenplays/{id}/narrate/cancelCancel narration - GET
/v1/video/screenplays/{id}/timelineGet timeline map - POST
/v1/video/screenplays/{id}/edit/screenplayEdit screenplay structure - POST
/v1/video/screenplays/{id}/edit/compositionEdit composition settings - POST
/v1/video/screenplays/{id}/edit/narrationEdit narration settings
Conversations
Chat conversation persistence
- GET
/v1/conversationsList conversations - POST
/v1/conversationsCreate a conversation - GET
/v1/conversations/{id}Get conversation - PUT
/v1/conversations/{id}Update conversation - DELETE
/v1/conversations/{id}Delete conversation - POST
/v1/conversations/{id}/renameRename conversation
OAuth
OAuth 2.1 connection management for third-party services
- POST
/v1/oauth/connectStart OAuth consent flow (Google, Reddit, GitHub, X) - POST
/v1/oauth/connect/service-accountConnect Google service account - GET
/v1/oauth/statusCheck all OAuth connection statuses - GET
/v1/oauth/status/{provider}Check single provider status - DELETE
/v1/oauth/disconnect/{provider}Disconnect and revoke tokens
Outreach
GitHub monitoring, content queue, HN, Reddit, X/Twitter, mentions
- GET
/v1/outreach/github/reposList GitHub repos - GET
/v1/outreach/github/activityGitHub repo activity - GET
/v1/outreach/github/compareCompare two Git refs - GET
/v1/outreach/github/poll-stateGet GitHub polling state - POST
/v1/outreach/github/poll-stateUpdate GitHub polling state - GET
/v1/outreach/mentionsGet real-time web mentions - GET
/v1/outreach/mentions/rulesList mention rules - POST
/v1/outreach/mentions/rulesCreate mention rule - DELETE
/v1/outreach/mentions/rules/{id}Delete mention rule - GET
/v1/outreach/queueList outreach queue - GET
/v1/outreach/queue/statsGet queue statistics - POST
/v1/outreach/queueAdd draft to queue - POST
/v1/outreach/queue/{id}/publishPublish a draft - DELETE
/v1/outreach/queue/{id}Delete a draft - GET
/v1/outreach/hn/searchSearch Hacker News - GET
/v1/outreach/hn/trendingHN trending stories - GET
/v1/outreach/reddit/searchSearch Reddit - POST
/v1/outreach/reddit/postPost to Reddit - GET
/v1/outreach/reddit/statusReddit connection status - POST
/v1/outreach/x/browseBrowse X/Twitter via CDP - POST
/v1/outreach/x/composeCompose tweet - GET
/v1/outreach/memoryGet content memory state - GET
/v1/outreach/memory/historyGet post history
System Actions
macOS system automation (26 action domains, integrated)
- GET
/v1/action-piper/statusSystem actions status - POST
/v1/action-piper/executeExecute a system action - GET
/v1/action-piper/app/listList running apps - GET
/v1/action-piper/app/snapshotNative app AX snapshot - POST
/v1/action-piper/app/actionPerform native app action - POST
/v1/action-piper/app/assertAssert native app state - GET
/v1/action-piper/window/listList all windows - GET
/v1/action-piper/systemSystem info - GET
/v1/action-piper/system/{domain}System info for specific domain
API Connections
Manage external API connections (OpenAI, Anthropic, Google, etc.)
- GET
/connectionsList API connections - POST
/connectionsCreate API connection - PUT
/connections/{id}Update API connection - DELETE
/connections/{id}Delete API connection
Tool Permissions
MCP tool access control
- GET
/v1/tool-permissionsGet tool permission settings - PUT
/v1/tool-permissionsUpdate tool permissions
Configurations
Endpoint-level inference configurations
- GET
/configurationsList all configurations - POST
/configurationsCreate a configuration - PUT
/configurations/{id}Update a configuration - DELETE
/configurations/{id}Delete a configuration
Recording
Unified browser + native app recording
- POST
/v1/record/startStart unified recording session - POST
/v1/record/stopStop recording session - GET
/v1/record/streamSSE stream of recorded actions
Workflow Templates
Curated pipeline workflow templates
- GET
/workflow-templatesList available workflow templates
System
Health, resources, events, and logging
- GET
/statusHealth check (no auth) - GET
/system/resourcesGPU, RAM, and ANE usage - GET
/eventsSSE event stream - GET
/licenseSubscription tier - GET
/v1/openapi.jsonOpenAPI spec (no auth) - POST
/logPost a single log entry (no auth) - GET
/logsQuery log entries (no auth) - POST
/logsPost log entries in batch (no auth) - GET
/logs/streamReal-time SSE log stream - POST
/clearClear all log entries - POST
/exportExport logs to file