Running a server without strad
Most of the MCP servers in strad’s repository are ordinary MCP servers. strad mounts them behind one endpoint, but nothing in them needs strad. A server with a standalone entrypoint runs on its own in two ways:
- stdio, launched by a local MCP client such as Claude Desktop or Claude Code.
- Streamable HTTP, at
/mcpon a localhost port you choose, for a client that connects by URL.
Each one has a README in its own directory with the build, the credentials, the client config and a curl check.
strad does not mount google-drive, so running it on its own is the only way to use it (limitation #124).
gmail on its own does not send mail. In strad, send_email waits for a human
to approve each send, through a channel only the gateway can hand the server
(confirmations). With no gateway there is nobody to
ask and no channel to trust, so the standalone entrypoint serves the read,
label and draft tools by default and refuses to start with
GMAIL_ENABLED_TOOLGROUPS=readwrite_external. Write a draft and send it from
Gmail.
What strad adds, and what you give up
Section titled “What strad adds, and what you give up”A standalone server is the same code strad mounts, built by the same factory. What you lose is everything strad does in front of it:
- No authentication on HTTP. Anyone who can reach the port can use the
server’s credential. The HTTP mode binds
127.0.0.1by default and refuses a request whoseHostheader is not loopback, which stops DNS rebinding from a browser tab. It does not stop another process on the same machine. - No per-tool policy, no confirmations, no telemetry. A
tools: allowlist, aconfirmations: truegate and strad’s metrics all live in the gateway. A tool that needs a confirmation is not served at all (gmail’ssend_email). The server’s own tool-group variable (GMAIL_ENABLED_TOOLGROUPS=readonly,GOOGLE_CALENDAR_ENABLED_TOOLGROUPS=readonly,GOOGLE_DOCS_ENABLED_TOOLGROUPS=readonly,GOOGLE_DRIVE_ENABLED_TOOLGROUPS=readonly) is the one narrowing left. In strad, google-docs’share_documentis kept off every slug but the external tier by atools:allow list; on its own, it is served unless you set the group. The standalone entrypoint refuses a group it does not recognise, so a typo cannot quietly mean “every tool”. - One credential per process. strad can mount one server once per account. On its own, a server is one process with one set of environment variables.
The shape, for the next server
Section titled “The shape, for the next server”The pattern lives in images/bundle-google/src/standalone/. serve.ts takes a
server factory and runs it over stdio or Streamable HTTP. Its flags are
--transport stdio|http, --port (else PORT, else 3000) and --host.
validateEnv lets an entrypoint refuse a setting the server would misread.
A server’s entrypoint is a few lines beside it that hand over the factory the
bundle already mounts. The README goes in the server’s own tree, and a case in
test/standalone.test.ts boots both transports with no credentials and lists
the tools.