Protocol Forge is a desktop app for connecting to, exploring, and debugging MCP (Model Context Protocol) servers. Point it at any MCP server — local or remote — and you get a live view of its tools, resources, and prompts; a schema-driven invocation interface; and a full real-time trace of every JSON-RPC message exchanged.
It is aimed at developers who build or integrate MCP servers and need reliable visibility into protocol behavior without wiring up custom scripts for every inspection task.
| Feature | Details |
|---|---|
| Multi-transport connections | Connect over stdio (local processes) or streamable-http. Profiles are saved and reusable. |
| Capability discovery | List tools, resources, and prompts for the active session in a tabbed panel. |
| Tool annotations | Server-supplied tool hints (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) render as badges. Tools marked destructive require explicit confirmation before invocation. Annotations are treated as untrusted hints — not security guarantees. |
| Schema-driven invocation | Invoke tools and read resources/prompts through auto-generated forms derived from the server's JSON Schema. Results include structured output and round-trip latency. |
| Structured output validation | Tool results carrying structuredContent are validated against the tool's declared outputSchema; pass/fail status surfaces above a typed view, with the raw content payload available as a fallback. |
| Protocol Inspector | Stream live JSON-RPC traffic with direction/method/text filters, pause/resume, and per-message detail. |
| Session history | All sessions and messages are persisted locally. Replay any historical session's protocol trace from the inspector. |
| Encrypted header storage | streamable-http profile headers (auth tokens, API keys) are encrypted at rest via the OS keystore. |
| Workspace roots | Configure file:// workspace roots per profile. Connected servers can list them via roots/list; changes propagate as notifications/roots/list_changed. |
| Sampling response panel | When a connected server calls sampling/createMessage, the request appears in an in-app panel where you compose a mock response (text/image/audio) by hand. No LLM backend is contacted. |
| Elicitation modal | Servers calling elicitation/create get a modal with three actions (Accept/Decline/Cancel). Form mode renders the requested schema (string/enum/number/boolean/array); URL mode opens the destination via shell.openExternal only after an explicit Accept. |
| In-flight progress + cancellation | Tool/resource/prompt invocations stream live progress (notifications/progress) into an in-app panel and can be cancelled mid-call — cancellation aborts the request and emits notifications/cancelled so the server can stop work. |
| Resource subscriptions | Subscribe to resources advertising resources.subscribe capability and watch notifications/resources/updated live — entries show a "Live" badge with the last update timestamp, and the resource view auto-refetches while open. Subscriptions are session-scoped and drained on disconnect. |
| Server logging | When a server advertises the logging capability, the Inspector exposes a Logs sub-panel showing live notifications/message entries with their RFC 5424 level, optional logger namespace, and pretty-printed data. A server-level selector calls logging/setLevel; an in-app filter further narrows the view by minimum severity. |
| In-app auto-update | The app checks for new releases on launch and offers a one-click restart when an update is ready. |
Download the installer for your platform from the Releases page.
v0.1.x builds are unsigned, so the OS will block them on first launch.
-
macOS: after copying
Protocol Forge.appto/Applications, clear the quarantine flag once:xattr -dr com.apple.quarantine "/Applications/Protocol Forge.app"Or right-click the app, choose Open, and confirm the Gatekeeper prompt.
-
Windows: SmartScreen will show "Windows protected your PC". Click "More info" then "Run anyway".
-
Linux: run the
.AppImagedirectly, or install the.deb.
Protocol Forge checks for new releases on launch and surfaces an in-app notification when an update is downloaded, so subsequent releases reach you without a manual download.
See SECURITY.md for the trust model and current limitations.
- Create a server profile in the sidebar — choose
stdioorstreamable-httpand fill in the command/URL. - Connect the profile and wait for session state
ready. - Open Discovery and load tools, resources, or prompts from the server.
- Invoke a tool or read a resource/prompt — results show structured output and latency.
- Use the Protocol Inspector to trace request/response traffic in real time.
- Review past sessions from the history panel to compare successful vs. failing runs.
transport: stdio
command: npx
args: @modelcontextprotocol/server-everything
cwd: <optional working directory>
Spawned stdio servers inherit only the MCP SDK's default env allowlist (PATH, HOME, USER, and platform equivalents). If your server requires additional host env vars, add them to the profile's env field.
transport: streamable-http
url: https://example.com/mcp
headers: Authorization: Bearer <token>
Legacy sse transport is no longer supported. The MCP specification
deprecated SSE in favor of Streamable HTTP; existing SSE profiles are
migrated to streamable-http automatically on launch.
Protocol Forge stores all data in a SQLite database (protocol-forge.db) inside the Electron userData directory:
| Platform | Path |
|---|---|
| macOS | ~/Library/Application Support/protocol-forge/protocol-forge.db |
| Linux | ~/.config/protocol-forge/protocol-forge.db |
| Windows | %APPDATA%\protocol-forge\protocol-forge.db |
stdioconnection fails — verify command/args/cwd and confirm the MCP server binary can launch from that context. If the server needs env vars not in the default allowlist, add them explicitly to the profile's env field.streamable-httpconnection fails — verify the URL scheme ishttporhttps, the endpoint path, and any required auth headers.- Discovery is empty — confirm the session state is
readybefore listing capabilities.
- Use Protocol Inspector filters (
direction,method,search) to isolate failures quickly. - Review historical sessions to compare a working run against a failing one.
- Latency metadata on tool results and inspector messages helps identify slow MCP operations.
- Strict Electron isolation:
contextIsolation+sandbox+ no renderer Node integration. - Every IPC payload crossing into main is validated with Zod-backed contracts.
- External server data is treated as untrusted and rendered defensively.
- Request headers for
streamable-httpprofiles are encrypted at rest via the OS keystore (Keychain on macOS, DPAPI on Windows, libsecret on Linux). On Linux hosts without a libsecret-compatible keyring, Protocol Forge logs a warning and falls back to plaintext. - Spawned
stdioservers inherit only the MCP SDK's default env allowlist — arbitrary host env vars are not leaked into child processes.
See SECURITY.md for the full policy.
- Electron 39
- React 19 + TypeScript (strict)
- Zustand for renderer state
- SQLite via
better-sqlite3 - MCP SDK (
@modelcontextprotocol/sdk) - Vitest + ESLint + Prettier
- Node.js 22+
- pnpm 10+
pnpm install
pnpm devQuality checks:
pnpm lint
pnpm typecheck
pnpm test --runProduction build:
pnpm buildpnpm build:mac
pnpm build:win
pnpm build:linux- docs/development.md — setup, scripts, validation, troubleshooting, release process.
- docs/architecture.md — process model, data flow, security boundaries, known limitations.
- SECURITY.md — trust model, accepted limitations, vulnerability disclosure.
- CHANGELOG.md — release history.