{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_kde3ayxjutfy","handle":"plinth","url":"https://wellknown.network/agents/plinth","links":{"self":"https://wellknown.network/agents/plinth/record.json","html":"https://wellknown.network/agents/plinth","markdown":"https://wellknown.network/agents/plinth/record.md","api":"https://wellknown.network/api/v1/agents/plinth","status":"https://wellknown.network/api/v1/agents/plinth/status","claim":"https://wellknown.network/agents/plinth/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/plinth/claim.json","badge":"https://wellknown.network/agents/plinth/badge.svg","openapi":"https://wellknown.network/openapi.json","history":"https://wellknown.network/api/v1/agents/plinth/history","tools":"https://wellknown.network/api/v1/agents/plinth/tools"},"ard":{"identifier":"urn:air:tryplinth.dev:server:plinth","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"Plinth","summary":"App hosting your agent runs: git, deploys, staging/production, Postgres. Owner approves risky steps.","description":"App hosting your agent runs: git, deploys, staging/production, Postgres. Owner approves risky steps.","publisher":{"name":"dev.tryplinth","url":null},"homepage":"https://tryplinth.dev/","repository":null,"version":"1.0.0","license":null,"protocols":["mcp"],"tags":[],"pricing":null,"endpoints":[{"url":"https://tryplinth.dev/mcp","type":"mcp_streamable_http","auth":null,"probeable":true}],"skills":null,"tools":null,"extra":{"updatedAt":"2026-10-15T06:57:58.23778Z","publishedAt":"2026-10-15T06:57:58.23778Z","registryName":"dev.tryplinth/plinth"},"attribution":{"kind":"mcp_registry","name":"mcp_registry","summary":"mcp_registry","version":"mcp_registry","description":"mcp_registry","homepageUrl":"mcp_registry","publisherName":"mcp_registry"}},"derived":{"capabilities":[{"slug":"data.database","name":"Databases","confidence":1,"provenance":"derived"},{"slug":"dev.version-control","name":"Version Control","confidence":1,"provenance":"derived"},{"slug":"commerce.payments","name":"Payments","confidence":1,"provenance":"derived"},{"slug":"communication.sms-voice","name":"SMS & Voice","confidence":1,"provenance":"derived"},{"slug":"communication.chat","name":"Team Chat","confidence":0.992,"provenance":"derived"},{"slug":"communication.notifications","name":"Notifications","confidence":0.977,"provenance":"derived"},{"slug":"dev.ci-cd","name":"CI/CD & Deploy","confidence":0.885,"provenance":"derived"},{"slug":"data.web-search","name":"Web Search","confidence":0.583,"provenance":"derived"}],"categories":["commerce","communication","data","dev"],"language":"fr"},"observed":{"status":"live","statusReason":"Responded 4h ago.","lastOkAt":"2026-10-23T16:27:39.513Z","lastProbedAt":"2026-10-23T16:27:39.513Z","statusComputedAt":"2026-10-23T16:31:08.551Z","reliability30d":{"probes":30,"successRate":1,"p50Ms":24,"basis":"mixed","measures":{"availability":"availability (some checks stopped at authentication)","latency":"response time (mixed)","tools":"partially observed","summary":"Some successful checks reached the service and some stopped at an authentication response; figures combine both."},"checks":{"total":30,"ok":30,"authBoundaryOk":1,"serviceOk":29,"note":"Counted from the observation rows for the window, checks of the server only (HTTP, A2A card, MCP initialize). ok = authBoundaryOk + serviceOk. `probes` is the sum of daily rollups and includes registry checks, so it can differ from `total`."}},"latestObservations":[{"at":"2026-10-23T16:27:39.513Z","kind":"mcp_initialize","ok":true,"httpStatus":401,"latencyMs":25,"error":null,"detail":{"authRequired":true,"wwwAuthenticate":"Bearer resource_metadata=\"https://tryplinth.dev/.well-known/oauth-protected-resource/mcp\""}},{"at":"2026-10-23T09:28:21.491Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":30,"error":null,"detail":{"tools":[{"name":"account.create","description":"Create 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 wit"},{"name":"account.status","description":"Finish signup: checks whether the owner approved, and returns your token (once) when they have."},{"name":"whoami","description":"Show the account this token belongs to, its policy and projects."},{"name":"project.create","description":"Create 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 "},{"name":"project.list","description":"List projects with their environments, live releases and URLs."},{"name":"project.get","description":"Show one project: git remote, environments, live release per environment, URLs."},{"name":"project.delete","description":"Delete a project, its repo, environments and databases. Irreversible. May return pending_approval: the owner is emailed a link to approve; tell them it is waiti"},{"name":"code.write","description":"Commit 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 ("},{"name":"code.list","description":"List files in the project repo (path and size) on a branch or commit."},{"name":"code.read","description":"Read one file from the project repo. Text comes back as utf8; binary files as base64."},{"name":"git.remote","description":"Get the authenticated git remote URL for pushing. Pushing main deploys staging; any other branch gets a preview environment."},{"name":"git.log","description":"Recent commits on a branch."},{"name":"git.branches","description":"Branches and their head commits."},{"name":"git.revert","description":"Revert a commit on a branch server-side. The new commit deploys like a push."},{"name":"env.list","description":"Environments for a project with live release and URL."},{"name":"env.secrets.set","description":"Set an environment variable for an environment. Restarts the env so it takes effect."},{"name":"env.secrets.list","description":"List environment variable names (values are never returned)."},{"name":"env.secrets.import","description":"Set 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 VI"},{"name":"env.secrets.unset","description":"Remove an environment variable."},{"name":"deploy","description":"Rebuild and deploy the head of the branch an environment tracks (staging tracks main). Production only changes via promote."},{"name":"deploy.status","description":"Releases 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_"},{"name":"deploy.cancel","description":"Stop a build that is still running (the latest one in the environment, or a given release id). The live release keeps serving."},{"name":"promote","description":"Promote the release running on one environment to another (default staging to production). Applies pending migrations first. May return pending_approval: the ow"},{"name":"rollback","description":"Point an environment back at its previous release (or a given release id). Does not roll back the database."},{"name":"db.query","description":"Run 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 ne"},{"name":"db.migrations","description":"Applied and pending migrations (files in migrations/*.sql, applied in name order)."},{"name":"db.migrate","description":"Apply pending migrations from the live release now (deploys do this automatically). Takes a snapshot first. May return pending_approval: the owner is emailed a "},{"name":"db.snapshot","description":"Take a snapshot (pg_dump) of an environment database."},{"name":"db.snapshots","description":"List snapshots for an environment. Staging and production get one automatically every night at 03:00 UTC, kept 7 days."},{"name":"db.restore","description":"Restore an environment database from a snapshot. Takes a safety snapshot first. Production needs owner approval. May return pending_approval: the owner is email"},{"name":"db.connection","description":"Get 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 li"},{"name":"cron.add","description":"Schedule 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 an"},{"name":"cron.list","description":"Cron jobs on an environment with last run and next run."},{"name":"cron.pause","description":"Pause a cron job (it stays defined but does not run)."},{"name":"cron.resume","description":"Resume a paused cron job."},{"name":"cron.remove","description":"Delete a cron job."},{"name":"cron.run","description":"Run a cron job now and return its result."},{"name":"cron.runs","description":"Recent runs of a cron job."},{"name":"domains.connect","description":"Map a domain you own to an environment. Point its DNS at the Plinth host; returns the record to create."},{"name":"domains.list","description":"Domains mapped to a project."},{"name":"domains.verify","description":"Check the TXT record of a connected domain; once it matches, the domain is served."},{"name":"domains.remove","description":"Unmap a domain."},{"name":"billing.status","description":"Whether a card is on file, this month's spend, the spend cap and recent charges."},{"name":"project.upgrade","description":"Move 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_approva"},{"name":"project.downgrade","description":"Move a project back to the free plan. Its custom domains stop being served. The subscription shrinks with a prorated credit."},{"name":"billing.card","description":"Ask 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 "},{"name":"domains.search","description":"Check 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."},{"name":"domains.buy","description":"Buy 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 registra"},{"name":"domains.orders","description":"Domains bought through Plinth on this account, with price, status and expiry."},{"name":"logs.query","description":"Logs for an environment: app stdout/stderr, build, cron and system lines. Filter by text and stream."},{"name":"metrics.get","description":"Request count, error rate and latency percentiles for an environment."},{"name":"analytics.get","description":"Visitors 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 t"},{"name":"seo.setup","description":"Check how search engines see an environment (title, description, robots.txt, sitemap, noindex) and get the steps to connect OpenSEO (openseo.so), an open-source"},{"name":"env.status","description":"Debug an environment: is it running, restarts, out-of-memory kills, memory/CPU use, live release, and the last errors from its logs."},{"name":"env.restart","description":"Restart an environment on its current release (fresh sandbox, same code and data)."},{"name":"env.exec","description":"Production 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 -"},{"name":"http.probe","description":"Send 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 rou"},{"name":"requests.query","description":"Recent HTTP requests to an environment: method, path, status, time taken. Filter to failures with min_status 500, or by path."},{"name":"approvals.list","description":"Approvals requested by this account, newest first. status: pending, approved, denied, cancelled, superseded (default all). Pending ones include approve_url, whi"},{"name":"approval.cancel","description":"Withdraw a pending approval request you made (for example one that is no longer needed). The owner can no longer approve it."},{"name":"approval.status","description":"Check an approval. When approved, result holds the action output."},{"name":"support.send","description":"Send the Plinth team a bug report, feature request or question. Include what you tried and what happened. Recent errors for the project are attached automatical"},{"name":"support.list","description":"Your support tickets with their status and the team's reply."},{"name":"webhooks.add","description":"Send Plinth events to a URL (your bot, Slack, Discord, Telegram, Zapier...). Events: deploy.succeeded, deploy.failed, approval.requested, approval.decided, app."},{"name":"webhooks.list","description":"Your webhooks with their last delivery status."},{"name":"webhooks.remove","description":"Delete a webhook."},{"name":"webhooks.test","description":"Send a test event to all your webhooks; check webhooks.list a few seconds later for the result."},{"name":"console.signin","description":"Get 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."},{"name":"token.rotate","description":"Replace 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)."},{"name":"agents.list","description":"Agents that have a key to this account, when each was last used, and which one you are."},{"name":"agents.revoke","description":"Owner only. Remove an agent's access to this account immediately."},{"name":"policy.set","description":"Owner only. Choose which approval types run without asking. Keys: project.create, project.delete, promote.production, migration.destructive, db.restore.producti"}],"toolCount":72,"toolsHash":"186e60f035abbb2dce9ed0a08b8dd4fcfbc4a0d4e6c8e4e807577f58e0a802ef","serverName":"plinth","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-23T02:23:19.095Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":19,"error":null,"detail":{"tools":[{"name":"account.create","description":"Create 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 wit"},{"name":"account.status","description":"Finish signup: checks whether the owner approved, and returns your token (once) when they have."},{"name":"whoami","description":"Show the account this token belongs to, its policy and projects."},{"name":"project.create","description":"Create 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 "},{"name":"project.list","description":"List projects with their environments, live releases and URLs."},{"name":"project.get","description":"Show one project: git remote, environments, live release per environment, URLs."},{"name":"project.delete","description":"Delete a project, its repo, environments and databases. Irreversible. May return pending_approval: the owner is emailed a link to approve; tell them it is waiti"},{"name":"code.write","description":"Commit 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 ("},{"name":"code.list","description":"List files in the project repo (path and size) on a branch or commit."},{"name":"code.read","description":"Read one file from the project repo. Text comes back as utf8; binary files as base64."},{"name":"git.remote","description":"Get the authenticated git remote URL for pushing. Pushing main deploys staging; any other branch gets a preview environment."},{"name":"git.log","description":"Recent commits on a branch."},{"name":"git.branches","description":"Branches and their head commits."},{"name":"git.revert","description":"Revert a commit on a branch server-side. The new commit deploys like a push."},{"name":"env.list","description":"Environments for a project with live release and URL."},{"name":"env.secrets.set","description":"Set an environment variable for an environment. Restarts the env so it takes effect."},{"name":"env.secrets.list","description":"List environment variable names (values are never returned)."},{"name":"env.secrets.import","description":"Set 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 VI"},{"name":"env.secrets.unset","description":"Remove an environment variable."},{"name":"deploy","description":"Rebuild and deploy the head of the branch an environment tracks (staging tracks main). Production only changes via promote."},{"name":"deploy.status","description":"Releases 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_"},{"name":"deploy.cancel","description":"Stop a build that is still running (the latest one in the environment, or a given release id). The live release keeps serving."},{"name":"promote","description":"Promote the release running on one environment to another (default staging to production). Applies pending migrations first. May return pending_approval: the ow"},{"name":"rollback","description":"Point an environment back at its previous release (or a given release id). Does not roll back the database."},{"name":"db.query","description":"Run 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 ne"},{"name":"db.migrations","description":"Applied and pending migrations (files in migrations/*.sql, applied in name order)."},{"name":"db.migrate","description":"Apply pending migrations from the live release now (deploys do this automatically). Takes a snapshot first. May return pending_approval: the owner is emailed a "},{"name":"db.snapshot","description":"Take a snapshot (pg_dump) of an environment database."},{"name":"db.snapshots","description":"List snapshots for an environment. Staging and production get one automatically every night at 03:00 UTC, kept 7 days."},{"name":"db.restore","description":"Restore an environment database from a snapshot. Takes a safety snapshot first. Production needs owner approval. May return pending_approval: the owner is email"},{"name":"db.connection","description":"Get 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 li"},{"name":"cron.add","description":"Schedule 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 an"},{"name":"cron.list","description":"Cron jobs on an environment with last run and next run."},{"name":"cron.pause","description":"Pause a cron job (it stays defined but does not run)."},{"name":"cron.resume","description":"Resume a paused cron job."},{"name":"cron.remove","description":"Delete a cron job."},{"name":"cron.run","description":"Run a cron job now and return its result."},{"name":"cron.runs","description":"Recent runs of a cron job."},{"name":"domains.connect","description":"Map a domain you own to an environment. Point its DNS at the Plinth host; returns the record to create."},{"name":"domains.list","description":"Domains mapped to a project."},{"name":"domains.verify","description":"Check the TXT record of a connected domain; once it matches, the domain is served."},{"name":"domains.remove","description":"Unmap a domain."},{"name":"billing.status","description":"Whether a card is on file, this month's spend, the spend cap and recent charges."},{"name":"project.upgrade","description":"Move 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_approva"},{"name":"project.downgrade","description":"Move a project back to the free plan. Its custom domains stop being served. The subscription shrinks with a prorated credit."},{"name":"billing.card","description":"Ask 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 "},{"name":"domains.search","description":"Check 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."},{"name":"domains.buy","description":"Buy 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 registra"},{"name":"domains.orders","description":"Domains bought through Plinth on this account, with price, status and expiry."},{"name":"logs.query","description":"Logs for an environment: app stdout/stderr, build, cron and system lines. Filter by text and stream."},{"name":"metrics.get","description":"Request count, error rate and latency percentiles for an environment."},{"name":"analytics.get","description":"Visitors 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 t"},{"name":"seo.setup","description":"Check how search engines see an environment (title, description, robots.txt, sitemap, noindex) and get the steps to connect OpenSEO (openseo.so), an open-source"},{"name":"env.status","description":"Debug an environment: is it running, restarts, out-of-memory kills, memory/CPU use, live release, and the last errors from its logs."},{"name":"env.restart","description":"Restart an environment on its current release (fresh sandbox, same code and data)."},{"name":"env.exec","description":"Production 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 -"},{"name":"http.probe","description":"Send 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 rou"},{"name":"requests.query","description":"Recent HTTP requests to an environment: method, path, status, time taken. Filter to failures with min_status 500, or by path."},{"name":"approvals.list","description":"Approvals requested by this account, newest first. status: pending, approved, denied, cancelled, superseded (default all). Pending ones include approve_url, whi"},{"name":"approval.cancel","description":"Withdraw a pending approval request you made (for example one that is no longer needed). The owner can no longer approve it."},{"name":"approval.status","description":"Check an approval. When approved, result holds the action output."},{"name":"support.send","description":"Send the Plinth team a bug report, feature request or question. Include what you tried and what happened. Recent errors for the project are attached automatical"},{"name":"support.list","description":"Your support tickets with their status and the team's reply."},{"name":"webhooks.add","description":"Send Plinth events to a URL (your bot, Slack, Discord, Telegram, Zapier...). Events: deploy.succeeded, deploy.failed, approval.requested, approval.decided, app."},{"name":"webhooks.list","description":"Your webhooks with their last delivery status."},{"name":"webhooks.remove","description":"Delete a webhook."},{"name":"webhooks.test","description":"Send a test event to all your webhooks; check webhooks.list a few seconds later for the result."},{"name":"console.signin","description":"Get 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."},{"name":"token.rotate","description":"Replace 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)."},{"name":"agents.list","description":"Agents that have a key to this account, when each was last used, and which one you are."},{"name":"agents.revoke","description":"Owner only. Remove an agent's access to this account immediately."},{"name":"policy.set","description":"Owner only. Choose which approval types run without asking. Keys: project.create, project.delete, promote.production, migration.destructive, db.restore.producti"}],"toolCount":72,"toolsHash":"186e60f035abbb2dce9ed0a08b8dd4fcfbc4a0d4e6c8e4e807577f58e0a802ef","serverName":"plinth","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-22T19:31:02.600Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":24,"error":null,"detail":{"tools":[{"name":"account.create","description":"Create 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 wit"},{"name":"account.status","description":"Finish signup: checks whether the owner approved, and returns your token (once) when they have."},{"name":"whoami","description":"Show the account this token belongs to, its policy and projects."},{"name":"project.create","description":"Create 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 "},{"name":"project.list","description":"List projects with their environments, live releases and URLs."},{"name":"project.get","description":"Show one project: git remote, environments, live release per environment, URLs."},{"name":"project.delete","description":"Delete a project, its repo, environments and databases. Irreversible. May return pending_approval: the owner is emailed a link to approve; tell them it is waiti"},{"name":"code.write","description":"Commit 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 ("},{"name":"code.list","description":"List files in the project repo (path and size) on a branch or commit."},{"name":"code.read","description":"Read one file from the project repo. Text comes back as utf8; binary files as base64."},{"name":"git.remote","description":"Get the authenticated git remote URL for pushing. Pushing main deploys staging; any other branch gets a preview environment."},{"name":"git.log","description":"Recent commits on a branch."},{"name":"git.branches","description":"Branches and their head commits."},{"name":"git.revert","description":"Revert a commit on a branch server-side. The new commit deploys like a push."},{"name":"env.list","description":"Environments for a project with live release and URL."},{"name":"env.secrets.set","description":"Set an environment variable for an environment. Restarts the env so it takes effect."},{"name":"env.secrets.list","description":"List environment variable names (values are never returned)."},{"name":"env.secrets.import","description":"Set 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 VI"},{"name":"env.secrets.unset","description":"Remove an environment variable."},{"name":"deploy","description":"Rebuild and deploy the head of the branch an environment tracks (staging tracks main). Production only changes via promote."},{"name":"deploy.status","description":"Releases 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_"},{"name":"deploy.cancel","description":"Stop a build that is still running (the latest one in the environment, or a given release id). The live release keeps serving."},{"name":"promote","description":"Promote the release running on one environment to another (default staging to production). Applies pending migrations first. May return pending_approval: the ow"},{"name":"rollback","description":"Point an environment back at its previous release (or a given release id). Does not roll back the database."},{"name":"db.query","description":"Run 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 ne"},{"name":"db.migrations","description":"Applied and pending migrations (files in migrations/*.sql, applied in name order)."},{"name":"db.migrate","description":"Apply pending migrations from the live release now (deploys do this automatically). Takes a snapshot first. May return pending_approval: the owner is emailed a "},{"name":"db.snapshot","description":"Take a snapshot (pg_dump) of an environment database."},{"name":"db.snapshots","description":"List snapshots for an environment. Staging and production get one automatically every night at 03:00 UTC, kept 7 days."},{"name":"db.restore","description":"Restore an environment database from a snapshot. Takes a safety snapshot first. Production needs owner approval. May return pending_approval: the owner is email"},{"name":"db.connection","description":"Get 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 li"},{"name":"cron.add","description":"Schedule 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 an"},{"name":"cron.list","description":"Cron jobs on an environment with last run and next run."},{"name":"cron.pause","description":"Pause a cron job (it stays defined but does not run)."},{"name":"cron.resume","description":"Resume a paused cron job."},{"name":"cron.remove","description":"Delete a cron job."},{"name":"cron.run","description":"Run a cron job now and return its result."},{"name":"cron.runs","description":"Recent runs of a cron job."},{"name":"domains.connect","description":"Map a domain you own to an environment. Point its DNS at the Plinth host; returns the record to create."},{"name":"domains.list","description":"Domains mapped to a project."},{"name":"domains.verify","description":"Check the TXT record of a connected domain; once it matches, the domain is served."},{"name":"domains.remove","description":"Unmap a domain."},{"name":"billing.status","description":"Whether a card is on file, this month's spend, the spend cap and recent charges."},{"name":"project.upgrade","description":"Move 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_approva"},{"name":"project.downgrade","description":"Move a project back to the free plan. Its custom domains stop being served. The subscription shrinks with a prorated credit."},{"name":"billing.card","description":"Ask 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 "},{"name":"domains.search","description":"Check 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."},{"name":"domains.buy","description":"Buy 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 registra"},{"name":"domains.orders","description":"Domains bought through Plinth on this account, with price, status and expiry."},{"name":"logs.query","description":"Logs for an environment: app stdout/stderr, build, cron and system lines. Filter by text and stream."},{"name":"metrics.get","description":"Request count, error rate and latency percentiles for an environment."},{"name":"analytics.get","description":"Visitors 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 t"},{"name":"seo.setup","description":"Check how search engines see an environment (title, description, robots.txt, sitemap, noindex) and get the steps to connect OpenSEO (openseo.so), an open-source"},{"name":"env.status","description":"Debug an environment: is it running, restarts, out-of-memory kills, memory/CPU use, live release, and the last errors from its logs."},{"name":"env.restart","description":"Restart an environment on its current release (fresh sandbox, same code and data)."},{"name":"env.exec","description":"Production 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 -"},{"name":"http.probe","description":"Send 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 rou"},{"name":"requests.query","description":"Recent HTTP requests to an environment: method, path, status, time taken. Filter to failures with min_status 500, or by path."},{"name":"approvals.list","description":"Approvals requested by this account, newest first. status: pending, approved, denied, cancelled, superseded (default all). Pending ones include approve_url, whi"},{"name":"approval.cancel","description":"Withdraw a pending approval request you made (for example one that is no longer needed). The owner can no longer approve it."},{"name":"approval.status","description":"Check an approval. When approved, result holds the action output."},{"name":"support.send","description":"Send the Plinth team a bug report, feature request or question. Include what you tried and what happened. Recent errors for the project are attached automatical"},{"name":"support.list","description":"Your support tickets with their status and the team's reply."},{"name":"webhooks.add","description":"Send Plinth events to a URL (your bot, Slack, Discord, Telegram, Zapier...). Events: deploy.succeeded, deploy.failed, approval.requested, approval.decided, app."},{"name":"webhooks.list","description":"Your webhooks with their last delivery status."},{"name":"webhooks.remove","description":"Delete a webhook."},{"name":"webhooks.test","description":"Send a test event to all your webhooks; check webhooks.list a few seconds later for the result."},{"name":"console.signin","description":"Get 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."},{"name":"token.rotate","description":"Replace 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)."},{"name":"agents.list","description":"Agents that have a key to this account, when each was last used, and which one you are."},{"name":"agents.revoke","description":"Owner only. Remove an agent's access to this account immediately."},{"name":"policy.set","description":"Owner only. Choose which approval types run without asking. Keys: project.create, project.delete, promote.production, migration.destructive, db.restore.producti"}],"toolCount":72,"toolsHash":"186e60f035abbb2dce9ed0a08b8dd4fcfbc4a0d4e6c8e4e807577f58e0a802ef","serverName":"plinth","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-22T12:29:50.712Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":23,"error":null,"detail":{"tools":[{"name":"account.create","description":"Create 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 wit"},{"name":"account.status","description":"Finish signup: checks whether the owner approved, and returns your token (once) when they have."},{"name":"whoami","description":"Show the account this token belongs to, its policy and projects."},{"name":"project.create","description":"Create 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 "},{"name":"project.list","description":"List projects with their environments, live releases and URLs."},{"name":"project.get","description":"Show one project: git remote, environments, live release per environment, URLs."},{"name":"project.delete","description":"Delete a project, its repo, environments and databases. Irreversible. May return pending_approval: the owner is emailed a link to approve; tell them it is waiti"},{"name":"code.write","description":"Commit 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 ("},{"name":"code.list","description":"List files in the project repo (path and size) on a branch or commit."},{"name":"code.read","description":"Read one file from the project repo. Text comes back as utf8; binary files as base64."},{"name":"git.remote","description":"Get the authenticated git remote URL for pushing. Pushing main deploys staging; any other branch gets a preview environment."},{"name":"git.log","description":"Recent commits on a branch."},{"name":"git.branches","description":"Branches and their head commits."},{"name":"git.revert","description":"Revert a commit on a branch server-side. The new commit deploys like a push."},{"name":"env.list","description":"Environments for a project with live release and URL."},{"name":"env.secrets.set","description":"Set an environment variable for an environment. Restarts the env so it takes effect."},{"name":"env.secrets.list","description":"List environment variable names (values are never returned)."},{"name":"env.secrets.import","description":"Set 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 VI"},{"name":"env.secrets.unset","description":"Remove an environment variable."},{"name":"deploy","description":"Rebuild and deploy the head of the branch an environment tracks (staging tracks main). Production only changes via promote."},{"name":"deploy.status","description":"Releases 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_"},{"name":"deploy.cancel","description":"Stop a build that is still running (the latest one in the environment, or a given release id). The live release keeps serving."},{"name":"promote","description":"Promote the release running on one environment to another (default staging to production). Applies pending migrations first. May return pending_approval: the ow"},{"name":"rollback","description":"Point an environment back at its previous release (or a given release id). Does not roll back the database."},{"name":"db.query","description":"Run 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 ne"},{"name":"db.migrations","description":"Applied and pending migrations (files in migrations/*.sql, applied in name order)."},{"name":"db.migrate","description":"Apply pending migrations from the live release now (deploys do this automatically). Takes a snapshot first. May return pending_approval: the owner is emailed a "},{"name":"db.snapshot","description":"Take a snapshot (pg_dump) of an environment database."},{"name":"db.snapshots","description":"List snapshots for an environment. Staging and production get one automatically every night at 03:00 UTC, kept 7 days."},{"name":"db.restore","description":"Restore an environment database from a snapshot. Takes a safety snapshot first. Production needs owner approval. May return pending_approval: the owner is email"},{"name":"db.connection","description":"Get 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 li"},{"name":"cron.add","description":"Schedule 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 an"},{"name":"cron.list","description":"Cron jobs on an environment with last run and next run."},{"name":"cron.pause","description":"Pause a cron job (it stays defined but does not run)."},{"name":"cron.resume","description":"Resume a paused cron job."},{"name":"cron.remove","description":"Delete a cron job."},{"name":"cron.run","description":"Run a cron job now and return its result."},{"name":"cron.runs","description":"Recent runs of a cron job."},{"name":"domains.connect","description":"Map a domain you own to an environment. Point its DNS at the Plinth host; returns the record to create."},{"name":"domains.list","description":"Domains mapped to a project."},{"name":"domains.verify","description":"Check the TXT record of a connected domain; once it matches, the domain is served."},{"name":"domains.remove","description":"Unmap a domain."},{"name":"billing.status","description":"Whether a card is on file, this month's spend, the spend cap and recent charges."},{"name":"project.upgrade","description":"Move 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_approva"},{"name":"project.downgrade","description":"Move a project back to the free plan. Its custom domains stop being served. The subscription shrinks with a prorated credit."},{"name":"billing.card","description":"Ask 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 "},{"name":"domains.search","description":"Check 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."},{"name":"domains.buy","description":"Buy 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 registra"},{"name":"domains.orders","description":"Domains bought through Plinth on this account, with price, status and expiry."},{"name":"logs.query","description":"Logs for an environment: app stdout/stderr, build, cron and system lines. Filter by text and stream."},{"name":"metrics.get","description":"Request count, error rate and latency percentiles for an environment."},{"name":"analytics.get","description":"Visitors 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 t"},{"name":"seo.setup","description":"Check how search engines see an environment (title, description, robots.txt, sitemap, noindex) and get the steps to connect OpenSEO (openseo.so), an open-source"},{"name":"env.status","description":"Debug an environment: is it running, restarts, out-of-memory kills, memory/CPU use, live release, and the last errors from its logs."},{"name":"env.restart","description":"Restart an environment on its current release (fresh sandbox, same code and data)."},{"name":"env.exec","description":"Production 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 -"},{"name":"http.probe","description":"Send 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 rou"},{"name":"requests.query","description":"Recent HTTP requests to an environment: method, path, status, time taken. Filter to failures with min_status 500, or by path."},{"name":"approvals.list","description":"Approvals requested by this account, newest first. status: pending, approved, denied, cancelled, superseded (default all). Pending ones include approve_url, whi"},{"name":"approval.cancel","description":"Withdraw a pending approval request you made (for example one that is no longer needed). The owner can no longer approve it."},{"name":"approval.status","description":"Check an approval. When approved, result holds the action output."},{"name":"support.send","description":"Send the Plinth team a bug report, feature request or question. Include what you tried and what happened. Recent errors for the project are attached automatical"},{"name":"support.list","description":"Your support tickets with their status and the team's reply."},{"name":"webhooks.add","description":"Send Plinth events to a URL (your bot, Slack, Discord, Telegram, Zapier...). Events: deploy.succeeded, deploy.failed, approval.requested, approval.decided, app."},{"name":"webhooks.list","description":"Your webhooks with their last delivery status."},{"name":"webhooks.remove","description":"Delete a webhook."},{"name":"webhooks.test","description":"Send a test event to all your webhooks; check webhooks.list a few seconds later for the result."},{"name":"console.signin","description":"Get 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."},{"name":"token.rotate","description":"Replace 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)."},{"name":"agents.list","description":"Agents that have a key to this account, when each was last used, and which one you are."},{"name":"agents.revoke","description":"Owner only. Remove an agent's access to this account immediately."},{"name":"policy.set","description":"Owner only. Choose which approval types run without asking. Keys: project.create, project.delete, promote.production, migration.destructive, db.restore.producti"}],"toolCount":72,"toolsHash":"186e60f035abbb2dce9ed0a08b8dd4fcfbc4a0d4e6c8e4e807577f58e0a802ef","serverName":"plinth","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-22T06:25:38.227Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":23,"error":null,"detail":{"tools":[{"name":"account.create","description":"Create 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 wit"},{"name":"account.status","description":"Finish signup: checks whether the owner approved, and returns your token (once) when they have."},{"name":"whoami","description":"Show the account this token belongs to, its policy and projects."},{"name":"project.create","description":"Create 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 "},{"name":"project.list","description":"List projects with their environments, live releases and URLs."},{"name":"project.get","description":"Show one project: git remote, environments, live release per environment, URLs."},{"name":"project.delete","description":"Delete a project, its repo, environments and databases. Irreversible. May return pending_approval: the owner is emailed a link to approve; tell them it is waiti"},{"name":"code.write","description":"Commit 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 ("},{"name":"code.list","description":"List files in the project repo (path and size) on a branch or commit."},{"name":"code.read","description":"Read one file from the project repo. Text comes back as utf8; binary files as base64."},{"name":"git.remote","description":"Get the authenticated git remote URL for pushing. Pushing main deploys staging; any other branch gets a preview environment."},{"name":"git.log","description":"Recent commits on a branch."},{"name":"git.branches","description":"Branches and their head commits."},{"name":"git.revert","description":"Revert a commit on a branch server-side. The new commit deploys like a push."},{"name":"env.list","description":"Environments for a project with live release and URL."},{"name":"env.secrets.set","description":"Set an environment variable for an environment. Restarts the env so it takes effect."},{"name":"env.secrets.list","description":"List environment variable names (values are never returned)."},{"name":"env.secrets.import","description":"Set 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 VI"},{"name":"env.secrets.unset","description":"Remove an environment variable."},{"name":"deploy","description":"Rebuild and deploy the head of the branch an environment tracks (staging tracks main). Production only changes via promote."},{"name":"deploy.status","description":"Releases 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_"},{"name":"deploy.cancel","description":"Stop a build that is still running (the latest one in the environment, or a given release id). The live release keeps serving."},{"name":"promote","description":"Promote the release running on one environment to another (default staging to production). Applies pending migrations first. May return pending_approval: the ow"},{"name":"rollback","description":"Point an environment back at its previous release (or a given release id). Does not roll back the database."},{"name":"db.query","description":"Run 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 ne"},{"name":"db.migrations","description":"Applied and pending migrations (files in migrations/*.sql, applied in name order)."},{"name":"db.migrate","description":"Apply pending migrations from the live release now (deploys do this automatically). Takes a snapshot first. May return pending_approval: the owner is emailed a "},{"name":"db.snapshot","description":"Take a snapshot (pg_dump) of an environment database."},{"name":"db.snapshots","description":"List snapshots for an environment. Staging and production get one automatically every night at 03:00 UTC, kept 7 days."},{"name":"db.restore","description":"Restore an environment database from a snapshot. Takes a safety snapshot first. Production needs owner approval. May return pending_approval: the owner is email"},{"name":"db.connection","description":"Get 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 li"},{"name":"cron.add","description":"Schedule 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 an"},{"name":"cron.list","description":"Cron jobs on an environment with last run and next run."},{"name":"cron.pause","description":"Pause a cron job (it stays defined but does not run)."},{"name":"cron.resume","description":"Resume a paused cron job."},{"name":"cron.remove","description":"Delete a cron job."},{"name":"cron.run","description":"Run a cron job now and return its result."},{"name":"cron.runs","description":"Recent runs of a cron job."},{"name":"domains.connect","description":"Map a domain you own to an environment. Point its DNS at the Plinth host; returns the record to create."},{"name":"domains.list","description":"Domains mapped to a project."},{"name":"domains.verify","description":"Check the TXT record of a connected domain; once it matches, the domain is served."},{"name":"domains.remove","description":"Unmap a domain."},{"name":"billing.status","description":"Whether a card is on file, this month's spend, the spend cap and recent charges."},{"name":"project.upgrade","description":"Move 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_approva"},{"name":"project.downgrade","description":"Move a project back to the free plan. Its custom domains stop being served. The subscription shrinks with a prorated credit."},{"name":"billing.card","description":"Ask 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 "},{"name":"domains.search","description":"Check 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."},{"name":"domains.buy","description":"Buy 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 registra"},{"name":"domains.orders","description":"Domains bought through Plinth on this account, with price, status and expiry."},{"name":"logs.query","description":"Logs for an environment: app stdout/stderr, build, cron and system lines. Filter by text and stream."},{"name":"metrics.get","description":"Request count, error rate and latency percentiles for an environment."},{"name":"analytics.get","description":"Visitors 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 t"},{"name":"seo.setup","description":"Check how search engines see an environment (title, description, robots.txt, sitemap, noindex) and get the steps to connect OpenSEO (openseo.so), an open-source"},{"name":"env.status","description":"Debug an environment: is it running, restarts, out-of-memory kills, memory/CPU use, live release, and the last errors from its logs."},{"name":"env.restart","description":"Restart an environment on its current release (fresh sandbox, same code and data)."},{"name":"env.exec","description":"Production 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 -"},{"name":"http.probe","description":"Send 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 rou"},{"name":"requests.query","description":"Recent HTTP requests to an environment: method, path, status, time taken. Filter to failures with min_status 500, or by path."},{"name":"approvals.list","description":"Approvals requested by this account, newest first. status: pending, approved, denied, cancelled, superseded (default all). Pending ones include approve_url, whi"},{"name":"approval.cancel","description":"Withdraw a pending approval request you made (for example one that is no longer needed). The owner can no longer approve it."},{"name":"approval.status","description":"Check an approval. When approved, result holds the action output."},{"name":"support.send","description":"Send the Plinth team a bug report, feature request or question. Include what you tried and what happened. Recent errors for the project are attached automatical"},{"name":"support.list","description":"Your support tickets with their status and the team's reply."},{"name":"webhooks.add","description":"Send Plinth events to a URL (your bot, Slack, Discord, Telegram, Zapier...). Events: deploy.succeeded, deploy.failed, approval.requested, approval.decided, app."},{"name":"webhooks.list","description":"Your webhooks with their last delivery status."},{"name":"webhooks.remove","description":"Delete a webhook."},{"name":"webhooks.test","description":"Send a test event to all your webhooks; check webhooks.list a few seconds later for the result."},{"name":"console.signin","description":"Get 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."},{"name":"token.rotate","description":"Replace 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)."},{"name":"agents.list","description":"Agents that have a key to this account, when each was last used, and which one you are."},{"name":"agents.revoke","description":"Owner only. Remove an agent's access to this account immediately."},{"name":"policy.set","description":"Owner only. Choose which approval types run without asking. Keys: project.create, project.delete, promote.production, migration.destructive, db.restore.producti"}],"toolCount":72,"toolsHash":"186e60f035abbb2dce9ed0a08b8dd4fcfbc4a0d4e6c8e4e807577f58e0a802ef","serverName":"plinth","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-21T23:28:46.894Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":26,"error":null,"detail":{"tools":[{"name":"account.create","description":"Create 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 wit"},{"name":"account.status","description":"Finish signup: checks whether the owner approved, and returns your token (once) when they have."},{"name":"whoami","description":"Show the account this token belongs to, its policy and projects."},{"name":"project.create","description":"Create 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 "},{"name":"project.list","description":"List projects with their environments, live releases and URLs."},{"name":"project.get","description":"Show one project: git remote, environments, live release per environment, URLs."},{"name":"project.delete","description":"Delete a project, its repo, environments and databases. Irreversible. May return pending_approval: the owner is emailed a link to approve; tell them it is waiti"},{"name":"code.write","description":"Commit 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 ("},{"name":"code.list","description":"List files in the project repo (path and size) on a branch or commit."},{"name":"code.read","description":"Read one file from the project repo. Text comes back as utf8; binary files as base64."},{"name":"git.remote","description":"Get the authenticated git remote URL for pushing. Pushing main deploys staging; any other branch gets a preview environment."},{"name":"git.log","description":"Recent commits on a branch."},{"name":"git.branches","description":"Branches and their head commits."},{"name":"git.revert","description":"Revert a commit on a branch server-side. The new commit deploys like a push."},{"name":"env.list","description":"Environments for a project with live release and URL."},{"name":"env.secrets.set","description":"Set an environment variable for an environment. Restarts the env so it takes effect."},{"name":"env.secrets.list","description":"List environment variable names (values are never returned)."},{"name":"env.secrets.import","description":"Set 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 VI"},{"name":"env.secrets.unset","description":"Remove an environment variable."},{"name":"deploy","description":"Rebuild and deploy the head of the branch an environment tracks (staging tracks main). Production only changes via promote."},{"name":"deploy.status","description":"Releases 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_"},{"name":"deploy.cancel","description":"Stop a build that is still running (the latest one in the environment, or a given release id). The live release keeps serving."},{"name":"promote","description":"Promote the release running on one environment to another (default staging to production). Applies pending migrations first. May return pending_approval: the ow"},{"name":"rollback","description":"Point an environment back at its previous release (or a given release id). Does not roll back the database."},{"name":"db.query","description":"Run 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 ne"},{"name":"db.migrations","description":"Applied and pending migrations (files in migrations/*.sql, applied in name order)."},{"name":"db.migrate","description":"Apply pending migrations from the live release now (deploys do this automatically). Takes a snapshot first. May return pending_approval: the owner is emailed a "},{"name":"db.snapshot","description":"Take a snapshot (pg_dump) of an environment database."},{"name":"db.snapshots","description":"List snapshots for an environment. Staging and production get one automatically every night at 03:00 UTC, kept 7 days."},{"name":"db.restore","description":"Restore an environment database from a snapshot. Takes a safety snapshot first. Production needs owner approval. May return pending_approval: the owner is email"},{"name":"db.connection","description":"Get 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 li"},{"name":"cron.add","description":"Schedule 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 an"},{"name":"cron.list","description":"Cron jobs on an environment with last run and next run."},{"name":"cron.pause","description":"Pause a cron job (it stays defined but does not run)."},{"name":"cron.resume","description":"Resume a paused cron job."},{"name":"cron.remove","description":"Delete a cron job."},{"name":"cron.run","description":"Run a cron job now and return its result."},{"name":"cron.runs","description":"Recent runs of a cron job."},{"name":"domains.connect","description":"Map a domain you own to an environment. Point its DNS at the Plinth host; returns the record to create."},{"name":"domains.list","description":"Domains mapped to a project."},{"name":"domains.verify","description":"Check the TXT record of a connected domain; once it matches, the domain is served."},{"name":"domains.remove","description":"Unmap a domain."},{"name":"billing.status","description":"Whether a card is on file, this month's spend, the spend cap and recent charges."},{"name":"project.upgrade","description":"Move 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_approva"},{"name":"project.downgrade","description":"Move a project back to the free plan. Its custom domains stop being served. The subscription shrinks with a prorated credit."},{"name":"billing.card","description":"Ask 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 "},{"name":"domains.search","description":"Check 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."},{"name":"domains.buy","description":"Buy 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 registra"},{"name":"domains.orders","description":"Domains bought through Plinth on this account, with price, status and expiry."},{"name":"logs.query","description":"Logs for an environment: app stdout/stderr, build, cron and system lines. Filter by text and stream."},{"name":"metrics.get","description":"Request count, error rate and latency percentiles for an environment."},{"name":"analytics.get","description":"Visitors 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 t"},{"name":"seo.setup","description":"Check how search engines see an environment (title, description, robots.txt, sitemap, noindex) and get the steps to connect OpenSEO (openseo.so), an open-source"},{"name":"env.status","description":"Debug an environment: is it running, restarts, out-of-memory kills, memory/CPU use, live release, and the last errors from its logs."},{"name":"env.restart","description":"Restart an environment on its current release (fresh sandbox, same code and data)."},{"name":"env.exec","description":"Production 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 -"},{"name":"http.probe","description":"Send 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 rou"},{"name":"requests.query","description":"Recent HTTP requests to an environment: method, path, status, time taken. Filter to failures with min_status 500, or by path."},{"name":"approvals.list","description":"Approvals requested by this account, newest first. status: pending, approved, denied, cancelled, superseded (default all). Pending ones include approve_url, whi"},{"name":"approval.cancel","description":"Withdraw a pending approval request you made (for example one that is no longer needed). The owner can no longer approve it."},{"name":"approval.status","description":"Check an approval. When approved, result holds the action output."},{"name":"support.send","description":"Send the Plinth team a bug report, feature request or question. Include what you tried and what happened. Recent errors for the project are attached automatical"},{"name":"support.list","description":"Your support tickets with their status and the team's reply."},{"name":"webhooks.add","description":"Send Plinth events to a URL (your bot, Slack, Discord, Telegram, Zapier...). Events: deploy.succeeded, deploy.failed, approval.requested, approval.decided, app."},{"name":"webhooks.list","description":"Your webhooks with their last delivery status."},{"name":"webhooks.remove","description":"Delete a webhook."},{"name":"webhooks.test","description":"Send a test event to all your webhooks; check webhooks.list a few seconds later for the result."},{"name":"console.signin","description":"Get 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."},{"name":"token.rotate","description":"Replace 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)."},{"name":"agents.list","description":"Agents that have a key to this account, when each was last used, and which one you are."},{"name":"agents.revoke","description":"Owner only. Remove an agent's access to this account immediately."},{"name":"policy.set","description":"Owner only. Choose which approval types run without asking. Keys: project.create, project.delete, promote.production, migration.destructive, db.restore.producti"}],"toolCount":72,"toolsHash":"186e60f035abbb2dce9ed0a08b8dd4fcfbc4a0d4e6c8e4e807577f58e0a802ef","serverName":"plinth","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-21T17:35:14.975Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":24,"error":null,"detail":{"tools":[{"name":"account.create","description":"Create 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 wit"},{"name":"account.status","description":"Finish signup: checks whether the owner approved, and returns your token (once) when they have."},{"name":"whoami","description":"Show the account this token belongs to, its policy and projects."},{"name":"project.create","description":"Create 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 "},{"name":"project.list","description":"List projects with their environments, live releases and URLs."},{"name":"project.get","description":"Show one project: git remote, environments, live release per environment, URLs."},{"name":"project.delete","description":"Delete a project, its repo, environments and databases. Irreversible. May return pending_approval: the owner is emailed a link to approve; tell them it is waiti"},{"name":"code.write","description":"Commit 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 ("},{"name":"code.list","description":"List files in the project repo (path and size) on a branch or commit."},{"name":"code.read","description":"Read one file from the project repo. Text comes back as utf8; binary files as base64."},{"name":"git.remote","description":"Get the authenticated git remote URL for pushing. Pushing main deploys staging; any other branch gets a preview environment."},{"name":"git.log","description":"Recent commits on a branch."},{"name":"git.branches","description":"Branches and their head commits."},{"name":"git.revert","description":"Revert a commit on a branch server-side. The new commit deploys like a push."},{"name":"env.list","description":"Environments for a project with live release and URL."},{"name":"env.secrets.set","description":"Set an environment variable for an environment. Restarts the env so it takes effect."},{"name":"env.secrets.list","description":"List environment variable names (values are never returned)."},{"name":"env.secrets.import","description":"Set 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 VI"},{"name":"env.secrets.unset","description":"Remove an environment variable."},{"name":"deploy","description":"Rebuild and deploy the head of the branch an environment tracks (staging tracks main). Production only changes via promote."},{"name":"deploy.status","description":"Releases 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_"},{"name":"deploy.cancel","description":"Stop a build that is still running (the latest one in the environment, or a given release id). The live release keeps serving."},{"name":"promote","description":"Promote the release running on one environment to another (default staging to production). Applies pending migrations first. May return pending_approval: the ow"},{"name":"rollback","description":"Point an environment back at its previous release (or a given release id). Does not roll back the database."},{"name":"db.query","description":"Run 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 ne"},{"name":"db.migrations","description":"Applied and pending migrations (files in migrations/*.sql, applied in name order)."},{"name":"db.migrate","description":"Apply pending migrations from the live release now (deploys do this automatically). Takes a snapshot first. May return pending_approval: the owner is emailed a "},{"name":"db.snapshot","description":"Take a snapshot (pg_dump) of an environment database."},{"name":"db.snapshots","description":"List snapshots for an environment. Staging and production get one automatically every night at 03:00 UTC, kept 7 days."},{"name":"db.restore","description":"Restore an environment database from a snapshot. Takes a safety snapshot first. Production needs owner approval. May return pending_approval: the owner is email"},{"name":"db.connection","description":"Get 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 li"},{"name":"cron.add","description":"Schedule 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 an"},{"name":"cron.list","description":"Cron jobs on an environment with last run and next run."},{"name":"cron.pause","description":"Pause a cron job (it stays defined but does not run)."},{"name":"cron.resume","description":"Resume a paused cron job."},{"name":"cron.remove","description":"Delete a cron job."},{"name":"cron.run","description":"Run a cron job now and return its result."},{"name":"cron.runs","description":"Recent runs of a cron job."},{"name":"domains.connect","description":"Map a domain you own to an environment. Point its DNS at the Plinth host; returns the record to create."},{"name":"domains.list","description":"Domains mapped to a project."},{"name":"domains.verify","description":"Check the TXT record of a connected domain; once it matches, the domain is served."},{"name":"domains.remove","description":"Unmap a domain."},{"name":"billing.status","description":"Whether a card is on file, this month's spend, the spend cap and recent charges."},{"name":"project.upgrade","description":"Move 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_approva"},{"name":"project.downgrade","description":"Move a project back to the free plan. Its custom domains stop being served. The subscription shrinks with a prorated credit."},{"name":"billing.card","description":"Ask 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 "},{"name":"domains.search","description":"Check 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."},{"name":"domains.buy","description":"Buy 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 registra"},{"name":"domains.orders","description":"Domains bought through Plinth on this account, with price, status and expiry."},{"name":"logs.query","description":"Logs for an environment: app stdout/stderr, build, cron and system lines. Filter by text and stream."},{"name":"metrics.get","description":"Request count, error rate and latency percentiles for an environment."},{"name":"analytics.get","description":"Visitors 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 t"},{"name":"seo.setup","description":"Check how search engines see an environment (title, description, robots.txt, sitemap, noindex) and get the steps to connect OpenSEO (openseo.so), an open-source"},{"name":"env.status","description":"Debug an environment: is it running, restarts, out-of-memory kills, memory/CPU use, live release, and the last errors from its logs."},{"name":"env.restart","description":"Restart an environment on its current release (fresh sandbox, same code and data)."},{"name":"env.exec","description":"Production 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 -"},{"name":"http.probe","description":"Send 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 rou"},{"name":"requests.query","description":"Recent HTTP requests to an environment: method, path, status, time taken. Filter to failures with min_status 500, or by path."},{"name":"approvals.list","description":"Approvals requested by this account, newest first. status: pending, approved, denied, cancelled, superseded (default all). Pending ones include approve_url, whi"},{"name":"approval.cancel","description":"Withdraw a pending approval request you made (for example one that is no longer needed). The owner can no longer approve it."},{"name":"approval.status","description":"Check an approval. When approved, result holds the action output."},{"name":"support.send","description":"Send the Plinth team a bug report, feature request or question. Include what you tried and what happened. Recent errors for the project are attached automatical"},{"name":"support.list","description":"Your support tickets with their status and the team's reply."},{"name":"webhooks.add","description":"Send Plinth events to a URL (your bot, Slack, Discord, Telegram, Zapier...). Events: deploy.succeeded, deploy.failed, approval.requested, approval.decided, app."},{"name":"webhooks.list","description":"Your webhooks with their last delivery status."},{"name":"webhooks.remove","description":"Delete a webhook."},{"name":"webhooks.test","description":"Send a test event to all your webhooks; check webhooks.list a few seconds later for the result."},{"name":"console.signin","description":"Get 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."},{"name":"token.rotate","description":"Replace 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)."},{"name":"agents.list","description":"Agents that have a key to this account, when each was last used, and which one you are."},{"name":"agents.revoke","description":"Owner only. Remove an agent's access to this account immediately."},{"name":"policy.set","description":"Owner only. Choose which approval types run without asking. Keys: project.create, project.delete, promote.production, migration.destructive, db.restore.producti"}],"toolCount":72,"toolsHash":"186e60f035abbb2dce9ed0a08b8dd4fcfbc4a0d4e6c8e4e807577f58e0a802ef","serverName":"plinth","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-21T06:26:40.812Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":22,"error":null,"detail":{"tools":[{"name":"account.create","description":"Create 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 wit"},{"name":"account.status","description":"Finish signup: checks whether the owner approved, and returns your token (once) when they have."},{"name":"whoami","description":"Show the account this token belongs to, its policy and projects."},{"name":"project.create","description":"Create 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 "},{"name":"project.list","description":"List projects with their environments, live releases and URLs."},{"name":"project.get","description":"Show one project: git remote, environments, live release per environment, URLs."},{"name":"project.delete","description":"Delete a project, its repo, environments and databases. Irreversible. May return pending_approval: the owner is emailed a link to approve; tell them it is waiti"},{"name":"code.write","description":"Commit 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 ("},{"name":"code.list","description":"List files in the project repo (path and size) on a branch or commit."},{"name":"code.read","description":"Read one file from the project repo. Text comes back as utf8; binary files as base64."},{"name":"git.remote","description":"Get the authenticated git remote URL for pushing. Pushing main deploys staging; any other branch gets a preview environment."},{"name":"git.log","description":"Recent commits on a branch."},{"name":"git.branches","description":"Branches and their head commits."},{"name":"git.revert","description":"Revert a commit on a branch server-side. The new commit deploys like a push."},{"name":"env.list","description":"Environments for a project with live release and URL."},{"name":"env.secrets.set","description":"Set an environment variable for an environment. Restarts the env so it takes effect."},{"name":"env.secrets.list","description":"List environment variable names (values are never returned)."},{"name":"env.secrets.import","description":"Set 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 VI"},{"name":"env.secrets.unset","description":"Remove an environment variable."},{"name":"deploy","description":"Rebuild and deploy the head of the branch an environment tracks (staging tracks main). Production only changes via promote."},{"name":"deploy.status","description":"Releases 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_"},{"name":"deploy.cancel","description":"Stop a build that is still running (the latest one in the environment, or a given release id). The live release keeps serving."},{"name":"promote","description":"Promote the release running on one environment to another (default staging to production). Applies pending migrations first. May return pending_approval: the ow"},{"name":"rollback","description":"Point an environment back at its previous release (or a given release id). Does not roll back the database."},{"name":"db.query","description":"Run 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 ne"},{"name":"db.migrations","description":"Applied and pending migrations (files in migrations/*.sql, applied in name order)."},{"name":"db.migrate","description":"Apply pending migrations from the live release now (deploys do this automatically). Takes a snapshot first. May return pending_approval: the owner is emailed a "},{"name":"db.snapshot","description":"Take a snapshot (pg_dump) of an environment database."},{"name":"db.snapshots","description":"List snapshots for an environment. Staging and production get one automatically every night at 03:00 UTC, kept 7 days."},{"name":"db.restore","description":"Restore an environment database from a snapshot. Takes a safety snapshot first. Production needs owner approval. May return pending_approval: the owner is email"},{"name":"db.connection","description":"Get 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 li"},{"name":"cron.add","description":"Schedule 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 an"},{"name":"cron.list","description":"Cron jobs on an environment with last run and next run."},{"name":"cron.pause","description":"Pause a cron job (it stays defined but does not run)."},{"name":"cron.resume","description":"Resume a paused cron job."},{"name":"cron.remove","description":"Delete a cron job."},{"name":"cron.run","description":"Run a cron job now and return its result."},{"name":"cron.runs","description":"Recent runs of a cron job."},{"name":"domains.connect","description":"Map a domain you own to an environment. Point its DNS at the Plinth host; returns the record to create."},{"name":"domains.list","description":"Domains mapped to a project."},{"name":"domains.verify","description":"Check the TXT record of a connected domain; once it matches, the domain is served."},{"name":"domains.remove","description":"Unmap a domain."},{"name":"billing.status","description":"Whether a card is on file, this month's spend, the spend cap and recent charges."},{"name":"project.upgrade","description":"Move 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_approva"},{"name":"project.downgrade","description":"Move a project back to the free plan. Its custom domains stop being served. The subscription shrinks with a prorated credit."},{"name":"billing.card","description":"Ask 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 "},{"name":"domains.search","description":"Check 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."},{"name":"domains.buy","description":"Buy 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 registra"},{"name":"domains.orders","description":"Domains bought through Plinth on this account, with price, status and expiry."},{"name":"logs.query","description":"Logs for an environment: app stdout/stderr, build, cron and system lines. Filter by text and stream."},{"name":"metrics.get","description":"Request count, error rate and latency percentiles for an environment."},{"name":"analytics.get","description":"Visitors 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 t"},{"name":"seo.setup","description":"Check how search engines see an environment (title, description, robots.txt, sitemap, noindex) and get the steps to connect OpenSEO (openseo.so), an open-source"},{"name":"env.status","description":"Debug an environment: is it running, restarts, out-of-memory kills, memory/CPU use, live release, and the last errors from its logs."},{"name":"env.restart","description":"Restart an environment on its current release (fresh sandbox, same code and data)."},{"name":"env.exec","description":"Production 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 -"},{"name":"http.probe","description":"Send 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 rou"},{"name":"requests.query","description":"Recent HTTP requests to an environment: method, path, status, time taken. Filter to failures with min_status 500, or by path."},{"name":"approvals.list","description":"Approvals requested by this account, newest first. status: pending, approved, denied, cancelled, superseded (default all). Pending ones include approve_url, whi"},{"name":"approval.cancel","description":"Withdraw a pending approval request you made (for example one that is no longer needed). The owner can no longer approve it."},{"name":"approval.status","description":"Check an approval. When approved, result holds the action output."},{"name":"support.send","description":"Send the Plinth team a bug report, feature request or question. Include what you tried and what happened. Recent errors for the project are attached automatical"},{"name":"support.list","description":"Your support tickets with their status and the team's reply."},{"name":"webhooks.add","description":"Send Plinth events to a URL (your bot, Slack, Discord, Telegram, Zapier...). Events: deploy.succeeded, deploy.failed, approval.requested, approval.decided, app."},{"name":"webhooks.list","description":"Your webhooks with their last delivery status."},{"name":"webhooks.remove","description":"Delete a webhook."},{"name":"webhooks.test","description":"Send a test event to all your webhooks; check webhooks.list a few seconds later for the result."},{"name":"console.signin","description":"Get 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."},{"name":"token.rotate","description":"Replace 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)."},{"name":"agents.list","description":"Agents that have a key to this account, when each was last used, and which one you are."},{"name":"agents.revoke","description":"Owner only. Remove an agent's access to this account immediately."},{"name":"policy.set","description":"Owner only. Choose which approval types run without asking. Keys: project.create, project.delete, promote.production, migration.destructive, db.restore.producti"}],"toolCount":72,"toolsHash":"186e60f035abbb2dce9ed0a08b8dd4fcfbc4a0d4e6c8e4e807577f58e0a802ef","serverName":"plinth","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-21T00:31:31.032Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":23,"error":null,"detail":{"tools":[{"name":"account.create","description":"Create 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 wit"},{"name":"account.status","description":"Finish signup: checks whether the owner approved, and returns your token (once) when they have."},{"name":"whoami","description":"Show the account this token belongs to, its policy and projects."},{"name":"project.create","description":"Create 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 "},{"name":"project.list","description":"List projects with their environments, live releases and URLs."},{"name":"project.get","description":"Show one project: git remote, environments, live release per environment, URLs."},{"name":"project.delete","description":"Delete a project, its repo, environments and databases. Irreversible. May return pending_approval: the owner is emailed a link to approve; tell them it is waiti"},{"name":"code.write","description":"Commit 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 ("},{"name":"code.list","description":"List files in the project repo (path and size) on a branch or commit."},{"name":"code.read","description":"Read one file from the project repo. Text comes back as utf8; binary files as base64."},{"name":"git.remote","description":"Get the authenticated git remote URL for pushing. Pushing main deploys staging; any other branch gets a preview environment."},{"name":"git.log","description":"Recent commits on a branch."},{"name":"git.branches","description":"Branches and their head commits."},{"name":"git.revert","description":"Revert a commit on a branch server-side. The new commit deploys like a push."},{"name":"env.list","description":"Environments for a project with live release and URL."},{"name":"env.secrets.set","description":"Set an environment variable for an environment. Restarts the env so it takes effect."},{"name":"env.secrets.list","description":"List environment variable names (values are never returned)."},{"name":"env.secrets.import","description":"Set 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 VI"},{"name":"env.secrets.unset","description":"Remove an environment variable."},{"name":"deploy","description":"Rebuild and deploy the head of the branch an environment tracks (staging tracks main). Production only changes via promote."},{"name":"deploy.status","description":"Releases 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_"},{"name":"deploy.cancel","description":"Stop a build that is still running (the latest one in the environment, or a given release id). The live release keeps serving."},{"name":"promote","description":"Promote the release running on one environment to another (default staging to production). Applies pending migrations first. May return pending_approval: the ow"},{"name":"rollback","description":"Point an environment back at its previous release (or a given release id). Does not roll back the database."},{"name":"db.query","description":"Run 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 ne"},{"name":"db.migrations","description":"Applied and pending migrations (files in migrations/*.sql, applied in name order)."},{"name":"db.migrate","description":"Apply pending migrations from the live release now (deploys do this automatically). Takes a snapshot first. May return pending_approval: the owner is emailed a "},{"name":"db.snapshot","description":"Take a snapshot (pg_dump) of an environment database."},{"name":"db.snapshots","description":"List snapshots for an environment. Staging and production get one automatically every night at 03:00 UTC, kept 7 days."},{"name":"db.restore","description":"Restore an environment database from a snapshot. Takes a safety snapshot first. Production needs owner approval. May return pending_approval: the owner is email"},{"name":"db.connection","description":"Get 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 li"},{"name":"cron.add","description":"Schedule 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 an"},{"name":"cron.list","description":"Cron jobs on an environment with last run and next run."},{"name":"cron.pause","description":"Pause a cron job (it stays defined but does not run)."},{"name":"cron.resume","description":"Resume a paused cron job."},{"name":"cron.remove","description":"Delete a cron job."},{"name":"cron.run","description":"Run a cron job now and return its result."},{"name":"cron.runs","description":"Recent runs of a cron job."},{"name":"domains.connect","description":"Map a domain you own to an environment. Point its DNS at the Plinth host; returns the record to create."},{"name":"domains.list","description":"Domains mapped to a project."},{"name":"domains.verify","description":"Check the TXT record of a connected domain; once it matches, the domain is served."},{"name":"domains.remove","description":"Unmap a domain."},{"name":"billing.status","description":"Whether a card is on file, this month's spend, the spend cap and recent charges."},{"name":"project.upgrade","description":"Move 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_approva"},{"name":"project.downgrade","description":"Move a project back to the free plan. Its custom domains stop being served. The subscription shrinks with a prorated credit."},{"name":"billing.card","description":"Ask 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 "},{"name":"domains.search","description":"Check 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."},{"name":"domains.buy","description":"Buy 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 registra"},{"name":"domains.orders","description":"Domains bought through Plinth on this account, with price, status and expiry."},{"name":"logs.query","description":"Logs for an environment: app stdout/stderr, build, cron and system lines. Filter by text and stream."},{"name":"metrics.get","description":"Request count, error rate and latency percentiles for an environment."},{"name":"analytics.get","description":"Visitors 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 t"},{"name":"seo.setup","description":"Check how search engines see an environment (title, description, robots.txt, sitemap, noindex) and get the steps to connect OpenSEO (openseo.so), an open-source"},{"name":"env.status","description":"Debug an environment: is it running, restarts, out-of-memory kills, memory/CPU use, live release, and the last errors from its logs."},{"name":"env.restart","description":"Restart an environment on its current release (fresh sandbox, same code and data)."},{"name":"env.exec","description":"Production 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 -"},{"name":"http.probe","description":"Send 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 rou"},{"name":"requests.query","description":"Recent HTTP requests to an environment: method, path, status, time taken. Filter to failures with min_status 500, or by path."},{"name":"approvals.list","description":"Approvals requested by this account, newest first. status: pending, approved, denied, cancelled, superseded (default all). Pending ones include approve_url, whi"},{"name":"approval.cancel","description":"Withdraw a pending approval request you made (for example one that is no longer needed). The owner can no longer approve it."},{"name":"approval.status","description":"Check an approval. When approved, result holds the action output."},{"name":"support.send","description":"Send the Plinth team a bug report, feature request or question. Include what you tried and what happened. Recent errors for the project are attached automatical"},{"name":"support.list","description":"Your support tickets with their status and the team's reply."},{"name":"webhooks.add","description":"Send Plinth events to a URL (your bot, Slack, Discord, Telegram, Zapier...). Events: deploy.succeeded, deploy.failed, approval.requested, approval.decided, app."},{"name":"webhooks.list","description":"Your webhooks with their last delivery status."},{"name":"webhooks.remove","description":"Delete a webhook."},{"name":"webhooks.test","description":"Send a test event to all your webhooks; check webhooks.list a few seconds later for the result."},{"name":"console.signin","description":"Get 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."},{"name":"token.rotate","description":"Replace 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)."},{"name":"agents.list","description":"Agents that have a key to this account, when each was last used, and which one you are."},{"name":"agents.revoke","description":"Owner only. Remove an agent's access to this account immediately."},{"name":"policy.set","description":"Owner only. Choose which approval types run without asking. Keys: project.create, project.delete, promote.production, migration.destructive, db.restore.producti"}],"toolCount":72,"toolsHash":"186e60f035abbb2dce9ed0a08b8dd4fcfbc4a0d4e6c8e4e807577f58e0a802ef","serverName":"plinth","capabilities":["tools"],"serverVersion":"0.1.0","protocolVersion":"2025-06-18"}}],"tools":null,"package":null,"toolSurface":{"id":"ts_edwdcaptvsj8","endpointId":"ep_4h3ybxgz7w3c","hash":"186e60f035abbb2dce9ed0a08b8dd4fcfbc4a0d4e6c8e4e807577f58e0a802ef","toolCount":72,"serverName":"plinth","serverVersion":"0.1.0","protocolVersion":"2025-06-18","firstSeenAt":"2026-10-15T12:31:51.149Z","lastSeenAt":"2026-10-23T09:28:21.490Z","observations":29,"toolNames":["account.create","account.status","whoami","project.create","project.list","project.get","project.delete","code.write","code.list","code.read","git.remote","git.log","git.branches","git.revert","env.list","env.secrets.set","env.secrets.list","env.secrets.import","env.secrets.unset","deploy","deploy.status","deploy.cancel","promote","rollback","db.query","db.migrations","db.migrate","db.snapshot","db.snapshots","db.restore","db.connection","cron.add","cron.list","cron.pause","cron.resume","cron.remove","cron.run","cron.runs","domains.connect","domains.list","domains.verify","domains.remove","billing.status","project.upgrade","project.downgrade","billing.card","domains.search","domains.buy","domains.orders","logs.query","metrics.get","analytics.get","seo.setup","env.status","env.restart","env.exec","http.probe","requests.query","approvals.list","approval.cancel","approval.status","support.send","support.list","webhooks.add","webhooks.list","webhooks.remove","webhooks.test","console.signin","token.rotate","agents.list","agents.revoke","policy.set"],"distinctSurfaces":1},"endpointFacts":[{"id":"ep_4h3ybxgz7w3c","url":"https://tryplinth.dev/mcp","type":"mcp_streamable_http","factsCheckedAt":"2026-10-23T09:28:21.516Z","auth":{"observedAt":"2026-10-23T09:28:21.555Z","authRequired":false,"scheme":null,"resourceMetadata":null,"authorizationServer":null,"conformance":{"dpop":false,"rfc8414":false,"rfc9728":false,"pkceS256":false,"clientIdMetadataDocument":false,"dynamicClientRegistration":false}},"tls":{"observedAt":"2026-10-23T09:28:21.605Z","protocol":"TLSv1.3","chainValid":true,"chainError":null,"hostMatches":true,"subject":"tryplinth.dev","issuer":{"commonName":"YE1","organization":"Let's Encrypt"},"validFrom":"2026-10-11T20:03:43.000Z","validTo":"2027-01-09T20:03:42.000Z","daysToExpiry":77,"sanCount":1,"fingerprint256":"EC:EF:0B:BA:05:B2:47:A6:C7:24:F4:04:7E:9D:C6:F2:67:A4:85:71:89:55:E4:38:70:A2:A9:24:9A:69:57:3D"}}]},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"mcp_registry","key":"dev.tryplinth/plinth","url":"https://registry.modelcontextprotocol.io/v0/servers/dev.tryplinth%2Fplinth","firstSeenAt":"2026-10-15T12:22:15.818Z","fetchedAt":"2026-10-22T06:18:31.947Z","normalizedAt":"2026-10-22T06:18:31.947Z"}]},"firstSeenAt":"2026-10-15T12:22:15.818Z","updatedAt":"2026-10-23T09:33:56.070Z"}