Just Publish vs Valet

A side-by-side look at the Just Publish and Valet MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.

Just Publish logoJust PublishCloud Platforms · Remote HTTP/SSEPublish a static website to a live public URL straight from chat.49FairAuth: not declaredValet logoValetDeveloper Tools · Remote HTTP/SSEGet share links, publish and manage websites, artifacts and agents. No account needed.60GoodAuth: oauth 2.0

Verdict: choose Just Publish for cloud platforms work over a hosted endpoint; choose Valet for developer tools over a hosted endpoint. You can also run both side by side in one mcpServers block.

Which MCP server should you choose?

Just Publish logoChoose Just Publish when

  • You need dedicated capabilities in the Cloud Platforms domain.
  • You prefer a remote HTTP/SSE transport.
  • You want tools like deploy, get_site_files, update_site_file.
Explore Just Publish

Valet logoChoose Valet when

  • You need dedicated capabilities in the Developer Tools domain.
  • You prefer a remote HTTP/SSE transport.
  • Its auth model fits you: OAuth 2.0.
  • You want tools like attach_channel, attach_connector, attach_resource.
Explore Valet

Feature & specification comparison

Rows where the two servers differ are marked.

SpecJust Publish logoJust PublishValet logoValet
CategoryCloud PlatformsDeveloper Tools
Quality signal49/100 · Fair60/100 · Good
Install commandConfirmedConfirmed
TransportRemote HTTP/SSERemote HTTP/SSE
AuthNot declaredOAuth 2.0
PricingNot declaredFreemium
Required env varsNone listedNone listed
Verified ownerCommunity listingCommunity listing
GitHub stars11
Directory activity 1 views 0 installs 0 upvotes 3 views 0 installs 1 upvotes
Tools362

Tools & capabilities

Just Publish tools 3

  • deployPublish a new static site (HTML/CSS/JS/images), or fully replace an existing one. Returns the live URL, a `site_id`, and an `edit_token`.
  • get_site_filesRead a published site's files so the assistant can make a targeted edit. Requires `site_id` + `edit_token`.
  • update_site_fileChange one or a few files in place (merge). Requires `site_id` + `edit_token`.

Valet tools 62

  • attach_channelAttach an existing organization channel to an agent, so the channel's events wake it. Find the channel with list_channels. A webhook channel lets callers outside Valet reach the agent. Attaching a channel that is already attached reports it and changes nothing. Slack needs a Slack app and a browser, so for Slack this gives the step to take and attaches nothing. Requires connecting a Valet account.
  • attach_connectorAttach an organization connector to a website or agent so it can call the connector's tools with the credential Valet holds. Attaching is a grant, and it is wider than it looks: for a website, every person who can open the page can call every tool the connector exposes. On a private website that is every member of the organization; on a password-protected or shared one it is everyone holding the password or the link. For an agent, the agent can. Valet does not narrow the connector's reach, so attach only what the thing needs, and check a website's access mode before you do. A website can hold only an organization connector that is an HTTP MCP server, on the sse or streamable-http transport; list_connectors with name marks which ones. A page calls the connector by its own name, which list_connector_tools reports. An app cannot hold a connector yet and the call says so. A connector that belongs to a single agent cannot be attached to anything else. Attaching a connector that is already attached changes nothing and is safe to repeat. Requires connecting a Valet account.
  • attach_resourceAttach a resource to an app: a named set of environment variables, such as a database's connection string, that the app reads as secrets. Name the resource. When the organization has none by that name, pass a provider from list_catalog_resources and the first call creates it, returning at once with state provisioning. Call again with the same arguments, env_prefix included, until the state is attached: the call that finds the resource ready attaches it and sets its variables, then asks for a restart if the app is running. The state is attaching while Valet still owes the restart or the variables, and conflicted when a name the resource sets is already set on the app; the answer gives the reason. An existing resource attaches by name alone, including one another app holds. The call is safe to repeat: one name is one resource however many times it is called, and an app can hold several under different names. Pass env_prefix when two resources would set the same variables. Read the names an attachment sets from list_catalog_resources before writing the app's code. A new database is empty, so the app creates its own tables, and its URL carries the TLS settings it needs. The app must exist, so publish it first. The running process does not see the variables until the restart completes; get_service shows the attachment's status and when the new process is running. Provisioning takes about a minute; call again every ten seconds. Values are never returned here. Requires connecting a Valet account.
  • attach_skillAttach a skill to an agent so the agent can use it. Give skill as org:<name> or a bare name for a skill the organization published. The agent always follows the skill's latest version; a version pin such as @v2 is ignored, and the answer says so. An org skill must already exist and be published (create_service with kind skill, then publish_skill), except a built-in such as governance or security: when the organization has published no skill of that name, the agent holds Valet's default, follows it, and moves to the organization's own skill once one is published. Give catalog:<name> for a skill from Valet's curated catalog: it installs a copy into the organization, or reuses the copy installed before, and attaches it at its latest version. A catalog skill whose name the organization's own skill holds is refused. The agent is rebuilt so the change takes effect. A skill that is already attached answers that nothing changed, without a rebuild; one whose name another attached skill holds is refused with nothing changed. Skills attach to agents only. Requires connecting a Valet account.
  • call_connectorRun one tool on a connector attached to a website and return what the connector answered. It is the sampling step of building a page that calls live data: discover, attach, read the schemas, then call one tool for real before you write any page code. Call it because a schema is not a shape. list_connector_tools gives you each tool's name and argument schema, which is what your call has to satisfy; this tells you what comes back, which is what the page has to parse. Results are text to read, not JSON to assume: many servers answer in markdown tables or prose, some expose a single meta-tool taking a whole command as one string, and a server that completes the handshake can still refuse half its tools when the stored credential's scope does not cover them. One real call settles all three. This runs the tool for real, with the organization's own credential and whatever side effects the tool has. It is not a dry run and there is no preview: a tool that sends, writes, or deletes will do so. Prefer a read-only tool when you are only learning the shape, and ask the user before running anything that changes their systems. The connector must already be attached to the site — attach_connector does that — and must be an HTTP MCP server. A tool that answers with an error is reported as an error carrying the connector's own text, which is usually the sentence that says what to fix. It calls a website's connectors only; an app's or agent's are refused. Requires connecting a Valet account.
  • claim_siteMove a site published anonymously into one of the caller's Valet organizations, making it permanent. Takes the claim_token, the last part of the claim URL that the anonymous publish_site returned, not the site_token: the site_token republishes the site and can never claim it. The site moves into an organization the account already belongs to; this tool never creates one. Pass new_name to rename the site on the way in, otherwise it keeps its generated name, with a suffix if the organization already holds that name. Claiming spends both credentials: afterwards use the site's name. Repeating a claim that already succeeded for this account reports where the site lives. Requires connecting a Valet account.
  • create_channelCreate a channel on an agent: a cron or heartbeat channel that wakes it on a schedule, a webhook channel that lets callers outside Valet reach it, or an mcp channel that serves it as an MCP server. The channel starts the agent's work; what the agent does when it fires is the prompt file channels/<name>.md in its source. A webhook is signed by a secret you choose, because this never returns a secret value: set it with set_env_vars on the agent first, then pass its name as secret_name. A webhook without secret_name is refused. Creating a channel that already exists with the same kind and settings reports it and changes nothing; different settings are refused, so destroy it first. Slack and Telegram need a browser, so for them this gives the step to take and creates nothing. Requires connecting a Valet account.
  • create_connectorCreate an organization connector from a Valet catalog entry. It is the step after list_catalog_connectors found the entry for the product the user named; attach_connector then lets a website's pages call it. It creates an entry whose credential is a secret. Pass each slot the entry asks for in secrets, as slot name to value. A slot the organization already holds as a secret needs no value here. If a required slot has neither, nothing is created and the answer names the slots still needed. A key given here passes through this conversation. That is a real cost and it is the user's call to make: if they hand you the key, use it, and say that they could instead enter it on the dashboard's Integrations page, where it goes straight to Valet. The answer names the slots that were filled and never the values in them. An entry that authorizes in a browser — OAuth, or a Composio toolkit — is not created here. The answer gives the entry's name and the Integrations page, which creates the connector and runs the authorization in one place. An entry the organization already has is reported as already there; no second connector is made. Requires connecting a Valet account.
  • create_pushOpen a Git push on a website, app, agent, or skill that exists, named by name: a branch of its repository, writable for one hour, that you push source to before you publish. Use it when you can run git with network access; it sends only what changed, so a large service publishes without carrying its files through the conversation. Otherwise publish with files. The service must exist first: create_service makes it. The result carries a Git URL with a credential, the push's id and branch, the commit it starts from, the name and email to commit as, and two recipes with every value filled in: clone the branch and edit, or push a directory as it stands. The limits name the most files, the largest file, and the largest total size a publish may hold; a push over them is refused. Run a recipe, then call publish_site, publish_app, publish_agent, or publish_skill with push: {id, commit}, where commit is the sha the recipe prints. Only you can publish a push you opened. The URL writes only this push's branch, cannot force-push, and expires with the push; do not share or log it. A service holds ten open pushes at once. Requires connecting a Valet account.
  • create_serviceCreate an empty website, app, agent, or skill in an organization, before publishing to it. This is the first step for anything new: publish_site, publish_app, publish_agent, and publish_skill change a service that exists and refuse a name that does not. Pass kind to say which you mean, and name to choose its name; omit name to have one generated, except for a skill, which needs one. A name another website, app, agent, or skill in the organization holds is refused, as is a create past the organization's limit for that kind. The result names the organization, kind, name, and URL; publish to the name next. A skill is know-how the organization shares with every member's agent: use kind skill, then publish_skill, when the user wants to share a skill with their team, such as one they keep locally. Its repository starts from a starter SKILL.md, or, for a well-known name such as governance or design-system, from Valet's default, which the organization's skill then replaces. Nothing reaches an agent until it is published. A skill is private at its URL: only members of the organization can open it. With catalog, it instead installs that skill from Valet's curated catalog under name, as the organization's own copy published as its first version. An organization that installed it before gets that copy back, whatever its name, and nothing is installed. Requires connecting a Valet account.
  • destroy_channelDestroy a channel and its routes. This cannot be undone, so confirm with the user first. Without name, it destroys an organization channel found with list_channels; an organization channel that any agent still holds is refused, and the answer names each holder: free each with detach_channel, then destroy it. With name, it destroys a channel that agent owns, such as one create_channel made; a channel the agent only holds from the organization is detached with detach_channel instead. A channel found only in the other scope is refused with the call to make. Destroying a channel that is already gone changes nothing. The organization's Slack integration removes every agent's Slack app, so for it this gives the step to take and destroys nothing. Requires connecting a Valet account.
  • destroy_checkerDestroy one of an organization's own checkers by name. Valet stops sending release files to its URL. Confirm with the user first. A checker that a release policy names is refused: the answer names the policies, so destroy_policy them first, or point them at another checker with set_policy. Destroying a checker that is already gone changes nothing. Requires connecting a Valet account.
  • +50 more on the listing page

Ready-to-paste client configs

Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.

Just Publish

mcpServers (Claude Desktop / Cursor)
{
  "mcpServers": {
    "just-publish-2": {
      "url": "https://mcp.justpublish.ai/"
    }
  }
}

Valet

mcpServers (Claude Desktop / Cursor)
{
  "mcpServers": {
    "valet": {
      "url": "https://api.valet.dev/mcp"
    }
  }
}

Frequently asked questions

Just Publish is categorized under Cloud Platforms and uses a remote HTTP/SSE transport. Valet belongs to Developer Tools and uses a remote HTTP/SSE transport. Pick Just Publish for cloud platforms work and Valet for developer tools.

Copy the mcpServers block from the config section on this page into your client's config (for example claude_desktop_config.json or ~/.cursor/mcp.json), then fully restart the client.

Just Publish has no declared pricing — check the project's own site. Valet is listed as freemium — a free tier with paid plans. Auth: oauth 2.0. If a server needs environment variables such as API keys, define them under the env key in your client's MCP config.

Yes. MCP clients support multiple servers: add just-publish-2 and valet as separate keys in the same mcpServers object, and your assistant will call tools from either one.

On AllMCPs, Just Publish has a quality signal of 49/100 (Fair) with 1 views, 0 installs and 1 GitHub stars. Valet has 60/100 (Good) with 3 views, 0 installs and 1 GitHub stars.