paperclip-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@paperclip-mcpshow me all open issues assigned to me"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Paperclip MCP Railway Template
Deploys paperclip-mcp β an operator-side MCP server for the Paperclip AI agent orchestration platform, giving you 95 tools over issues, agents, goals, projects, approvals, costs, routines, decisions and pipelines β behind an NGINX bearer-token auth gateway.
ποΈ Architecture
client ββAuthorization: Bearer <key>βββΊ paperclip-mcp-gateway (nginx, public)
β
βΌ private network
paperclip-mcp (private) βββΊ PaperclipTwo Railway services:
paperclip-mcp-gatewayβnginx:1.29.8-alpine, exposes a public domain, validates theAuthorization: Bearer <key>header againstAPI_KEYS, and forwards streamable-HTTP traffic to the mcp service via Railway's private network.paperclip-mcpβ built from the upstream source at a pinned commit (seemcp/Dockerfile), run with--transport=streamable-http. Do not give this service a public domain; it is only reachable atpaperclip-mcp.railway.internal:8000.
The gateway talks to Paperclip through nothing but the mcp service, and the mcp service reaches Paperclip over PAPERCLIP_API_URL β point that at your Paperclip's private endpoint so Paperclip itself never needs to be public either.
Related MCP server: Kanban MCP
β¨ Features
Bearer-token auth with a comma-separated allowlist of keys
Streamable HTTP passthrough (
/mcp)Unauthenticated
/health(and/healthz) on the gateway for Railway healthchecksBoard or agent API key β the Paperclip-side boundary on top of the network-level bearer auth
Optional keyed-path entrypoint for MCP clients that cannot send an
AuthorizationheaderZero custom code β gateway is plain nginx, mcp is the upstream package with a pinned dependency set
πββοΈ How to use
Click the Railway button π
Fill in the variables (see below)
Deploy! π
Let Paperclip accept the private hostname (see Reaching Paperclip)
Point your MCP client at
https://<gateway-domain>/mcp(streamable-HTTP,"type": "http") with headerAuthorization: Bearer <your-key>. Quick check:curl -sS -X POST https://<gateway-domain>/mcp \ -H "Authorization: Bearer <your-key>" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'With Claude Code:
claude mcp add paperclip --transport http https://<gateway-domain>/mcp \ --header "Authorization: Bearer <your-key>"
π§± Infrastructure as Code
.railway/railway.ts defines the whole project β both services and every variable.
railway link
npm install
# First apply only; later runs omit these and preserve() keeps the values.
export API_KEYS=$(openssl rand -hex 32)
export PAPERCLIP_API_URL=http://paperclip.railway.internal:3100
export PAPERCLIP_API_KEY=pcp_board_...
export PAPERCLIP_COMPANY_ID=<uuid>
npm run plan # read the diff before applying
npm run apply
railway domain --service paperclip-mcp-gatewayGive the domain to the gateway only. paperclip-mcp holds your Paperclip key and has no
authentication of its own.
Paperclip is external to this template. Point PAPERCLIP_API_URL at whichever instance
the operator should run, and allow the hostname on that instance (see below).
Needs the Railway CLI 5.42.1 or newer: the IaC engine ships in the CLI, not in the npm
package. If you forked this repo, change REPO in railway.ts to your own before applying.
Link it to a project dedicated to this template. An apply deletes every resource and
every variable the file does not declare, so from then on variables live in railway.ts,
not the dashboard. Do not point it at a project created from the deploy button β the
service names differ, and a mismatch is a delete and recreate, not a rename.
β¬οΈ Upgrading
Railway template updates are opt-in β an existing deployment keeps running until you apply the update. See the changelog for what each update contains.
π§ Variables
Gateway service
Variable | Required | Description |
| yes | Comma-separated list of allowed bearer tokens. Allowed chars per key: |
| no | Defaults to |
| no | Defaults to |
| no |
|
MCP service
Variable | Required | Description |
| yes | Base URL of your Paperclip, e.g. |
| no | A board API key ( |
| yes | Company UUID every company-scoped tool targets β the UUID in the Paperclip UI URL, |
| no | Default agent UUID for |
| no | Forwarded as |
| no | Defaults to |
Mint a board key with paperclipai login, or POST /api/board-api-keys from a logged-in board session. Run the whoami tool to confirm which credential is active β the mcp service also logs it at startup.
π Keyed-path entrypoint (opt-in)
Some MCP clients enumerate a server's tools before they have anywhere to store a
credential, so their discovery request arrives with no Authorization header and
takes a 401. Setting PATH_KEY_AUTH=true on the gateway adds a second way in:
https://<gateway-domain>/k/<your-key>/mcpThe key is validated against the same API_KEYS allowlist. An absent or wrong
key is still 401, and a valid key unlocks nothing but /mcp β the key segment
is stripped before proxying, so the mcp service only ever sees /mcp.
The key travels in the URL, where it can be recorded by edge and proxy logs outside your control (the gateway itself logs nothing for this path). So:
Issue a separate key in
API_KEYSfor each client that uses this path, so it can be rotated without touching the others.Leave
PATH_KEY_AUTHoff and use the header form everywhere else.Keys used on this path may not contain
/(the header form allows it), since a slash would split the path segment.
π Reaching Paperclip over the private network
Paperclip's private-hostname guard answers 403 to any request whose Host is not on its
allowlist, and by default that list holds only the public hostname derived from
BETTER_AUTH_BASE_URL. A request from the mcp service arrives as
paperclip.railway.internal, so every tool fails with:
This hostname is not allowed for this Paperclip instance. If you want to allow a hostname, run npx paperclipai allowed-hostname <host>.Set this on the Paperclip service (not on this template) and redeploy it:
PAPERCLIP_ALLOWED_HOSTNAMES=paperclip.railway.internalIt is a comma-separated list; the public hostname stays allowed. Use your Paperclip
service's own RAILWAY_PRIVATE_DOMAIN if it is not named paperclip. The alternative is
pointing PAPERCLIP_API_URL at the public URL, which works but sends every call out through
Railway's edge instead of the private network.
π Two layers of protection
Bearer auth at the gateway is the network boundary β nothing reaches the MCP without a valid key.
The Paperclip API key is the Paperclip-side boundary. A board key can approve hires, pause and terminate agents, set budgets and mint API keys, so a leaked gateway key hands all of that over. An agent key limits the blast radius to what that one agent may do (board-only tools return
403), at the cost of the operator features this server exists for.
paperclip-mcp has no client authentication of its own β it binds to loopback upstream precisely because it is meant to sit next to your MCP client. The gateway is therefore mandatory if the service is reachable from anything outside Railway's private network.
π Notes
Generate strong keys:
openssl rand -hex 32Rotating a key: update
API_KEYSon the gateway service and redeploy it. The mcp service is untouched./healthand/healthzare unauthenticated so Railway (and any uptime monitor) can probe without a token. Everything else requiresAuthorization: Bearer <key>.Invalid / missing token: the gateway returns
401with aWWW-Authenticate: Bearer realm="paperclip-mcp"header.Do not expose the mcp service publicly. All traffic should enter through the gateway.
Gateway port: nginx listens on
PORT, which the IaC file pins to80. Railway injects a randomPORTwhen the variable is unset, so if you create the gateway by hand and give its domain an explicit target port, setPORTto match or the edge getsconnection refused.Startup is best-effort: the mcp service probes Paperclip's
/healthand classifies the key when it boots, but an unreachable Paperclip is logged, not fatal. Check the service logs if every tool errors.The PyPI
paperclip-mcppackage is a different project (older, another author). This template builds thewizarck/paperclip-mcpsource at a pinned SHA viaARG PAPERCLIP_MCP_SHAinmcp/Dockerfile, with its dependency tree frozen inmcp/requirements.txt. Bump the SHA and regenerate the requirements to pick up upstream changes.
βοΈ License
This server cannot be deployed
Maintenance
Related MCP Connectors
Connect, monitor, and control AI agents β tasks, approvals, schedules, and governance.
- mcp-serverOAuthcom.make
Give your AI agents the tools to build, manage, and run automation workflows.
Your org's AI agents, tasks, runs, search, and brain files as MCP tools and resources.
- PriorifyOAuthapp.priorify
Agent-complete, permission-scoped product operations for Priorify workspaces.
Related MCP Servers
- AlicenseDqualityDmaintenanceAI-native orchestration layer with 80+ tools for task management, code editing, browser automation, terminal control, and persistent memory across CLI, local MCP, and cloud deployments.694 npm31ISC
- FlicenseNot gradedqualityDmaintenanceA comprehensive project management system that provides a full-featured Kanban board and dashboard accessible to AI agents. It enables agents to programmatically manage projects, tasks, and workflows through a suite of 13 specialized tools and 4 resource types.4-
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to manage Paperclip AI agents, issues, goals, approvals, and costs via natural language by exposing Paperclip's REST API as MCP tools.MIT
- FlicenseNot gradedqualityCmaintenanceEnables AI clients to manage Paperclip issues, comments, and approvals via read, write, and composite action tools.-