protogrid

Search / dev.tryplinth/plinth

Plinth

R0· no sign-in

App hosting your agent runs: git, deploys, staging/production, Postgres. Owner approves risky steps.

v1.0.0 · active · website · descriptor JSON · versions

An agent can connect right now, no human step.Remote endpoint, no authentication, reachable on the last probe.
Quality69new
Trust83of 100
Uptime, 30 days100%
Latency p50536 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "plinth": {
      "type": "http",
      "url": "https://tryplinth.dev/mcp"
    }
  }
}
claude mcp add --transport http plinth https://tryplinth.dev/mcp
[mcp_servers.plinth]
url = "https://tryplinth.dev/mcp"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "plinth": {
      "type": "remote",
      "url": "https://tryplinth.dev/mcp",
      "enabled": true
    }
  }
}
{
  "mcpServers": {
    "plinth": {
      "type": "http",
      "url": "https://tryplinth.dev/mcp"
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=plinth&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vdHJ5cGxpbnRoLmRldi9tY3AifQ%3D%3D"
}
{
  "servers": {
    "plinth": {
      "type": "http",
      "url": "https://tryplinth.dev/mcp"
    }
  }
}
{
  "mcpServers": {
    "plinth": {
      "httpUrl": "https://tryplinth.dev/mcp"
    }
  }
}
extensions:
  "plinth":
    enabled: true
    name: "plinth"
    type: streamable_http
    uri: "https://tryplinth.dev/mcp"
    timeout: 300

Quality 69 / 100new

protocol75 · weight 25
  • warn
    protocol.modernnewest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
  • n/a
    protocol.statelessonly applies to 2026-07-28 servers
  • pass
    protocol.transportstreamable HTTP
  • n/a
    protocol.list_ttlonly applies to 2026-07-28 servers
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene64 · weight 30
  • warn
    tools.descriptions3 of 72 tools have a description under 20 characters
  • pass
    tools.description_lengthdescriptions are concise
  • pass
    tools.schemasevery tool has an object input schema
  • fail
    tools.annotationsno tool declares readOnlyHint or destructiveHint, so clients cannot tell safe calls from risky ones
  • fail
    tools.directory_hintsno tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: promote (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); support.list (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); account.create (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); …
  • pass
    tools.token_costabout 6,200 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stabilityn/a · weight 15
  • n/a
    stability.changes, stability.rug_pulltool history recorded for 5 of the 7 days needed
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI package

72 tools, about 6,200 tokens to load them all · tool set 902c191708dd · checked 2026-10-20 11:40 UTC

Tool changes

No tool definition changes recorded. A server's first observation is its baseline; later probes record what changes.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 83 / 100

no-repository
provenance55
liveness100
freshness100
hygiene80

+dns-namespace +website +reachable +uptime-100% +updated-5d-ago -no-repository

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://tryplinth.dev/mcp streamable-httpnoneyes100%536 ms2025-11-252026-10-20

Tools (72)

account.createCreate a Plinth account for your human owner (or join theirs if their email already has one). Plinth emails them a link to approve; then call account.status with the returned signup_id and poll to collect your token.
account.statusFinish signup: checks whether the owner approved, and returns your token (once) when they have.
agents.listAgents that have a key to this account, when each was last used, and which one you are.
agents.revokeOwner only. Remove an agent's access to this account immediately.
analytics.getVisitors and page views per day, top pages, where visitors come from, and phone vs desktop. No cookies; visitors are counted per day. Free shows today; Pro up to 90 days.
approval.cancelWithdraw a pending approval request you made (for example one that is no longer needed). The owner can no longer approve it.
approvals.listApprovals requested by this account, newest first. status: pending, approved, denied, cancelled, superseded (default all). Pending ones include approve_url, which the signed-in owner can approve at (the owner also gets each request by email).
approval.statusCheck an approval. When approved, result holds the action output.
billing.cardAsk the owner to add or replace the payment card. Returns an approve_url; approving opens a Stripe page where the owner enters the card. Plinth never sees card numbers. May return pending_approval: the owner is emailed a link to approve; tell them it is waiting, then poll approval.status.
billing.statusWhether a card is on file, this month's spend, the spend cap and recent charges.
code.listList files in the project repo (path and size) on a branch or commit.
code.readRead one file from the project repo. Text comes back as utf8; binary files as base64.
code.writeCommit files to the project without git: for agents that cannot run git or the CLI (e.g. Claude or ChatGPT in the cloud). Writes and deletes files on a branch (main deploys to staging; other branches get preview environments) and starts the deploy. Send whole files; text as utf8, binary as base64. Up to 5 MB per file.
console.signinGet the owner into the web console. Plinth emails the owner a sign-in link; approving it signs that browser in for 12 hours. The agent never receives a session. May return pending_approval: the owner is emailed a link to approve; tell them it is waiting, then poll approval.status.
cron.addSchedule a job: Plinth POSTs to path on the environment at each tick (5-field cron, UTC), with the header x-plinth-cron-secret. Paths under /api/cron/ refuse any other caller. Outside production jobs start paused unless enabled is true. Jobs can also be declared in plinth.json "crons".
cron.listCron jobs on an environment with last run and next run.
cron.pausePause a cron job (it stays defined but does not run).
cron.removeDelete a cron job.
cron.resumeResume a paused cron job.
cron.runRun a cron job now and return its result.
cron.runsRecent runs of a cron job.
db.connectionGet the DATABASE_URL for an environment (the same one the app receives). Production needs owner approval. May return pending_approval: the owner is emailed a link to approve; tell them it is waiting, then poll approval.status.
db.migrateApply pending migrations from the live release now (deploys do this automatically). Takes a snapshot first. May return pending_approval: the owner is emailed a link to approve; tell them it is waiting, then poll approval.status.
db.migrationsApplied and pending migrations (files in migrations/*.sql, applied in name order).
db.queryRun SQL against an environment database. Returns up to 500 rows. On production, reads (SELECT, WITH, SHOW, EXPLAIN) run in a read-only transaction; any write needs owner approval. May return pending_approval: the owner is emailed a link to approve; tell them it is waiting, then poll approval.status.
db.restoreRestore an environment database from a snapshot. Takes a safety snapshot first. Production needs owner approval. May return pending_approval: the owner is emailed a link to approve; tell them it is waiting, then poll approval.status.
db.snapshotTake a snapshot (pg_dump) of an environment database.
db.snapshotsList snapshots for an environment. Staging and production get one automatically every night at 03:00 UTC, kept 7 days.
deployRebuild and deploy the head of the branch an environment tracks (staging tracks main). Production only changes via promote.
deploy.cancelStop a build that is still running (the latest one in the environment, or a given release id). The live release keeps serving.
deploy.statusReleases for an environment, newest first, with status and build log of the latest. Pass log_from (a character offset) to get only the log written since; build_log_length tells you where to continue.
domains.buyBuy a domain and connect it to an environment: registers it, points DNS at Plinth, issues HTTPS. Always shows the owner the exact price first. Standard registrations only. May return pending_approval: the owner is emailed a link to approve; tell them it is waiting, then poll approval.status.
domains.connectMap a domain you own to an environment. Point its DNS at the Plinth host; returns the record to create.
domains.listDomains mapped to a project.
domains.ordersDomains bought through Plinth on this account, with price, status and expiry.
domains.removeUnmap a domain.
domains.searchCheck if domains can be bought here, with price. Pass a name ("acme" checks acme.com, .dev, .app, .io, .co, .net, .ai, .org) or a full domain.
domains.verifyCheck the TXT record of a connected domain; once it matches, the domain is served.
env.execProduction needs owner approval. Run a shell command inside the environment's running sandbox (same code, env vars, network and limits as the app), e.g. "node -e '...'", "ls", "env | sort". 30s timeout, 20 KB of output. Code is read-only; /tmp is writable. May return pending_approval: the owner is emailed a link to approve; tell them it is waiting, then poll approval.status.
env.listEnvironments for a project with live release and URL.
env.restartRestart an environment on its current release (fresh sandbox, same code and data).
env.secrets.importSet many environment variables at once from .env text (KEY=value lines; # comments, quotes and "export" are fine). One restart at the end. Keys starting with VITE_/NEXT_PUBLIC_/PUBLIC_ also reach the build.
env.secrets.listList environment variable names (values are never returned).
env.secrets.setSet an environment variable for an environment. Restarts the env so it takes effect.
env.secrets.unsetRemove an environment variable.
env.statusDebug an environment: is it running, restarts, out-of-memory kills, memory/CPU use, live release, and the last errors from its logs.
git.branchesBranches and their head commits.
git.logRecent commits on a branch.
git.remoteGet the authenticated git remote URL for pushing. Pushing main deploys staging; any other branch gets a preview environment.
git.revertRevert a commit on a branch server-side. The new commit deploys like a push.
http.probeSend one HTTP request to the environment from inside Plinth and return status, headers, timing and the first 8 KB of the body. Use it to reproduce a failing route.
logs.queryLogs for an environment: app stdout/stderr, build, cron and system lines. Filter by text and stream.
metrics.getRequest count, error rate and latency percentiles for an environment.
policy.setOwner only. Choose which approval types run without asking. Keys: project.create, project.delete, promote.production, migration.destructive, db.restore.production, billing.
project.createCreate a project: a git repo plus production and staging environments, each with its own Postgres database. May return pending_approval: the owner is emailed a link to approve; tell them it is waiting, then poll approval.status.
project.deleteDelete a project, its repo, environments and databases. Irreversible. May return pending_approval: the owner is emailed a link to approve; tell them it is waiting, then poll approval.status.
project.downgradeMove a project back to the free plan. Its custom domains stop being served. The subscription shrinks with a prorated credit.
project.getShow one project: git remote, environments, live release per environment, URLs.
project.listList projects with their environments, live releases and URLs.
project.upgradeMove a project to Pro ($19/month per project): own domains and more room. Charges the owner's card now (prorated) after they approve. May return pending_approval: the owner is emailed a link to approve; tell them it is waiting, then poll approval.status.
promotePromote the release running on one environment to another (default staging to production). Applies pending migrations first. May return pending_approval: the owner is emailed a link to approve; tell them it is waiting, then poll approval.status.
requests.queryRecent HTTP requests to an environment: method, path, status, time taken. Filter to failures with min_status 500, or by path.
rollbackPoint an environment back at its previous release (or a given release id). Does not roll back the database.
seo.setupCheck how search engines see an environment (title, description, robots.txt, sitemap, noindex) and get the steps to connect OpenSEO (openseo.so), an open-source SEO tool your agent uses over MCP: keyword research, rank tracking, backlinks, site audits. The owner signs up on OpenSEO; Plinth does not share any data with it.
support.listYour support tickets with their status and the team's reply.
support.sendSend the Plinth team a bug report, feature request or question. Include what you tried and what happened. Recent errors for the project are attached automatically. Replies show up in support.list.
token.rotateReplace your own agent token with a new one; the old one stops working immediately. Save the new token in ~/.plinth/config.json (the CLI does this for you).
webhooks.addSend Plinth events to a URL (your bot, Slack, Discord, Telegram, Zapier...). Events: deploy.succeeded, deploy.failed, approval.requested, approval.decided, app.down, app.up, support.created, support.replied, charge.succeeded, signup.approved. Leave events empty for all. Payloads are JSON with a "text" summary and an x-plinth-signature HMAC header; Slack/Discord webhook URLs and Telegram sendMessage URLs work as-is.
webhooks.listYour webhooks with their last delivery status.
webhooks.removeDelete a webhook.
webhooks.testSend a test event to all your webhooks; check webhooks.list a few seconds later for the result.
whoamiShow the account this token belongs to, its policy and projects.

Schemas: list_tools.

Similar MCP servers

Official server.json
{
  "name": "dev.tryplinth/plinth",
  "title": "Plinth",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://tryplinth.dev/mcp",
      "type": "streamable-http"
    }
  ],
  "version": "1.0.0",
  "websiteUrl": "https://tryplinth.dev/",
  "description": "App hosting your agent runs: git, deploys, staging/production, Postgres. Owner approves risky steps."
}