CC Workflow Studio AI Editor
breaking-brake/cc-wf-studio
Creates and edits visual agent workflows in CC Workflow Studio through conversation, with the agent reading and writing the canvas over MCP.
A skill your agent uses when migrating MCP servers already configured in a local agent client (Claude Code, Codex, Cursor, Gemini CLI, VS Code or another client) to an explicit Speakeasy AI Control…
$ npx skills add speakeasy-api/gram --skill add-existing-mcp-servers -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install speakeasy-api/gram add-existing-mcp-servers --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/speakeasy-api/gram.git skills-src && mkdir -p .claude/skills && cp -r skills-src/server/internal/plugins/platform_mcp_skills/add-existing-mcp-servers .claude/skills/add-existing-mcp-servers && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "add-existing-mcp-servers" agent skill from https://github.com/speakeasy-api/gram/tree/main/server/internal/plugins/platform_mcp_skills/add-existing-mcp-servers into .claude/skills/add-existing-mcp-servers/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-existing-mcp-servers", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/speakeasy-api/gram/tree/main/server/internal/plugins/platform_mcp_skills/add-existing-mcp-serversType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add speakeasy-api/gram --skill add-existing-mcp-servers -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install speakeasy-api/gram add-existing-mcp-servers --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/speakeasy-api/gram.git skills-src && mkdir -p .agents/skills && cp -r skills-src/server/internal/plugins/platform_mcp_skills/add-existing-mcp-servers .agents/skills/add-existing-mcp-servers && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "add-existing-mcp-servers" agent skill from https://github.com/speakeasy-api/gram/tree/main/server/internal/plugins/platform_mcp_skills/add-existing-mcp-servers into .agents/skills/add-existing-mcp-servers/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-existing-mcp-servers", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add speakeasy-api/gram --skill add-existing-mcp-servers -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install speakeasy-api/gram add-existing-mcp-servers --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/speakeasy-api/gram.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/server/internal/plugins/platform_mcp_skills/add-existing-mcp-servers .cursor/skills/add-existing-mcp-servers && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "add-existing-mcp-servers" agent skill from https://github.com/speakeasy-api/gram/tree/main/server/internal/plugins/platform_mcp_skills/add-existing-mcp-servers into .cursor/skills/add-existing-mcp-servers/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-existing-mcp-servers", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/speakeasy-api/gram.git --path server/internal/plugins/platform_mcp_skills/add-existing-mcp-servers--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add speakeasy-api/gram --skill add-existing-mcp-servers -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install speakeasy-api/gram add-existing-mcp-servers --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/speakeasy-api/gram.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/server/internal/plugins/platform_mcp_skills/add-existing-mcp-servers .gemini/skills/add-existing-mcp-servers && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "add-existing-mcp-servers" agent skill from https://github.com/speakeasy-api/gram/tree/main/server/internal/plugins/platform_mcp_skills/add-existing-mcp-servers into .gemini/skills/add-existing-mcp-servers/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-existing-mcp-servers", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install speakeasy-api/gram add-existing-mcp-serversInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add speakeasy-api/gram --skill add-existing-mcp-servers -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/speakeasy-api/gram.git skills-src && mkdir -p .github/skills && cp -r skills-src/server/internal/plugins/platform_mcp_skills/add-existing-mcp-servers .github/skills/add-existing-mcp-servers && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "add-existing-mcp-servers" agent skill from https://github.com/speakeasy-api/gram/tree/main/server/internal/plugins/platform_mcp_skills/add-existing-mcp-servers into .github/skills/add-existing-mcp-servers/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-existing-mcp-servers", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add speakeasy-api/gram --skill add-existing-mcp-servers -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install speakeasy-api/gram add-existing-mcp-servers --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/speakeasy-api/gram.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/server/internal/plugins/platform_mcp_skills/add-existing-mcp-servers .opencode/skills/add-existing-mcp-servers && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "add-existing-mcp-servers" agent skill from https://github.com/speakeasy-api/gram/tree/main/server/internal/plugins/platform_mcp_skills/add-existing-mcp-servers into .opencode/skills/add-existing-mcp-servers/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-existing-mcp-servers", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
add-existing-mcp-serversA skill your agent uses when migrating MCP servers already configured in a local agent client (Claude Code, Codex, Cursor, Gemini CLI, VS Code or another client) to an explicit Speakeasy AI Control…
Add Existing MCP Servers is an agent skill from speakeasy-api/gram. Use when migrating MCP servers already configured in a local agent client (Claude Code, Codex, Cursor, Gemini CLI, VS Code or another client) to an explicit Speakeasy AI Control Plane project as remote MCPs, including discovering which servers are missing and optionally restricting them to the organization's Tailscale private network.
Its SKILL.md is about 7.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Agent Workflows, covering MCP servers. It works with Model Context Protocol and Visual Studio Code. The repository describes itself as: Securely scale AI usage across your organization. A single stack to Connect, Secure, Observe and Distribute agents, MCPs, and Skills within your company. The licence is AGPL-3.0.
9 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit b4c4904. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
claudeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Add Existing MCP Servers loads about 7.4k tokens when it runs. Until then it costs about 90 tokens; SKILL.md has 3,937 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from speakeasy-api/gram at commit b4c4904, republished under its AGPL-3.0 licence (© speakeasy-api). 3,937 words, ~7,429 tokens.
.claude/skills/add-existing-mcp-servers/SKILL.md (or your agent's skills folder).Add selected supported remote servers from the agent client you are running in to a Speakeasy AI Control Plane (AICP) project without editing local client configuration, then optionally restrict them to the organization's Tailscale private network. Installation grants no access; live authentication, entitlement, membership and administrator checks remain authoritative. All management mutations use authenticated Platform MCP tools, never direct backend APIs.
Before any local discovery (including asking for manual inventory), successfully call list_projects with limit: 100 through your OWN Speakeasy connection in this client session. Dashboard state, install intent, another client's authentication, or a prior session's result is not proof of access. It accepts only limit (capped at 100), not cursor or search. If unavailable or denied, stop and offer the normal Speakeasy sign-in/setup flow. If truncated: true, project discovery is incomplete: stop and hand off project selection to the AICP dashboard rather than inventing pagination or guessing a destination.
If the user says they want the migrated servers kept on their Tailscale private network, call get_network_ingress once now and tell them what it reports (step 8 explains how to read it), so any dashboard setup can start while the import runs. A private network that is not ready never blocks the import; it only decides whether step 8 can finish in this session.
Name the client you are running in, and discover only that client's own MCP servers, never another client's. Use a listing command only when you know it exists:
| Client | Listing command | Known effects |
|---|---|---|
| Claude Code | claude mcp list | health-checks approved/enabled servers, as described below |
| Any other client (for example Codex, Cursor, Gemini CLI or VS Code) | only a listing subcommand documented by that client's own --help | unknown until checked: unless the client's help states that listing never starts or connects to servers, describe and treat it as having the same effects as claude mcp list |
Never invent a subcommand or flag. If the client has no documented listing command, or you cannot tell which client you are in, use the user-sanitized manual inventory. Never open a client's MCP configuration files yourself: they commonly hold headers, tokens and environment values.
Before running claude mcp list or another client's listing command locally, obtain explicit permission. Require explicit informed consent for the following effects, not merely permission to view a list. Explain that claude mcp list health-checks approved/enabled servers, can launch stdio processes and contact local/private-network endpoints BEFORE filtering out unsupported entries. Those processes may write files or contact services; do not promise zero process side effects or passive/read-only discovery. Approval of a server in the client is not consent to run this discovery now. Explain the scope: current CLI user, working directory and configuration scope, not every client, account or workspace. Connection status does not establish remote importability.
Offer a user-sanitized manual inventory instead (non-secret alias, safe endpoint, transport only), without running discovery, if the user declines those effects or local execution is unavailable. Never demand raw output. Do not inspect credential files, expand environment values, or forward raw output to any tool, service or report. Do not invent a no-connect flag. Never edit local configuration, approval settings or credentials to enable discovery. The no-edit rule constrains the agent; it cannot guarantee that the CLI or launched servers have no side effects.
If discovery succeeds but returns no entries, report that no servers were found in the inspected scope. Offer a user-sanitized manual inventory or the normal catalogue path (add-mcp-from-catalog) as explicit next choices; do not switch workflows without the user's choice. Do not claim import completion for an empty inventory.
Retain only non-secret alias, exact safe endpoint, declared transport and provenance needed for selection. Never copy local credentials, including headers, tokens, passwords, environment secrets or OAuth state. Do not request secrets in chat.
Sort every entry into exactly one group:
Safe non-secret endpoint query parameters can be meaningful; preserve them. Never manufacture a safe URL by silently stripping credentials or changing its path. Block the entire uncertain item and ask for secure/manual resolution; do not echo sensitive URL components. Server validation remains authoritative, including network safety checks.
Exclude the connected Speakeasy management endpoint itself to prevent recursive import. Establish its identity from trusted connection endpoint metadata or other exact endpoint evidence, not display name alone. If that evidence is unavailable or ambiguous, flag the possible self-reference for manual resolution rather than importing it.
Present sanitized candidates, local servers left unchanged, and blocked items. Confirm candidate selection and destination from the eligible projects returned above; keep that project's ID and slug paired. Never infer the destination from a local alias or the Default project.
Use find_mcp with the selected project_id and limit: 100, no query or readiness filter. Follow every next_cursor using cursor with the same project until exhausted. Never combine query and cursor; a name search is not an exhaustive inventory. If listing fails or pagination cannot finish, do not conclude a candidate is missing.
Use get_mcp with project_id and returned mcp_id to inspect possible matches. Compare exact upstream URL and server-issued source/registration evidence. Deduplicate aliases only by proven identity, not hostname or display name: different paths or meaningful query values may represent different servers. Preserve the alias-to-item mapping for the final report. If identity cannot be proven, block for manual resolution rather than guessing or creating a duplicate. An identity match alone is not an already-present success: apply the model-specific completion evidence in step 6 before classifying it. A matching pending or incomplete registration must not be reported as already present or complete, and must not trigger a duplicate registration.
Prefer a suitable reviewed catalogue entry, even when its endpoint differs from the local server, but never silently substitute based on a name. Keep the original sanitized alias/endpoint and the effective confirmed target as separate identities.
search_mcp_catalog with the safe full endpoint as query. This is text search, not an exact URL lookup: its only inputs are optional query, provider_key and cursor; there is no URL lookup flag or remote_url search input. Follow next_cursor with the same query and provider_key (unlike find_mcp pagination). Results contain provider_key, catalog_ref, name, description, version, tool count and setup intent, not guaranteed endpoint evidence. Inspect plausible results with inspect_mcp_candidate using the returned provider_key and catalog_ref, without remote_url. Claim exact endpoint identity only if returned evidence proves it; an absent canonical_url is unknown, not a match.query. Do not invent a provider_key from a product name: it is a server-issued source filter. Deduplicate results by returned provider_key plus catalog_ref. A name hit is only a proposed alternative, never proof of equivalence. A URL search miss does not rule out a reviewed alternative.provider_key/catalog_ref plus confirmed configuration and any returned endpoint. Recheck existing registrations after substitution: repeat the selected project's complete find_mcp inventory and inspect matches with get_mcp, comparing server-issued source/registration evidence for this confirmed catalogue target, not only the original URL. Deduplicate confirmed catalogue targets across aliases too, only when configuration identity is proven. Two configurations of one catalogue reference are not the same target. Inventory does not expose selected configuration values or a configuration fingerprint; source/reference alone cannot prove configuration equivalence. For any registration without server-backed proof of its exact effective configuration, keep configuration identity unverified and request manual resolution; do not claim already present or create a duplicate. If already present, apply step 6's completion checks and do not register again; pending/incomplete or uncertain identity blocks duplicate creation.inspect_mcp_candidate with the original remote_url, without provider_key or catalog_ref. Present its canonical_url, transport, tool_names/tool_count, trust, authentication, oauth_discovery, automatic_client_registration, requires_dashboard_setup, setup_category and actions where returned. After declining a catalogue candidate, require explicit confirmation of the inspected direct target, destination project and exact direct batch before register_remote_mcp; declining the candidate is not consent to the fallback. Never manufacture a direct URL from a catalogue name. Unsupported, denied or inconclusive candidates remain blocked pending returned guidance.Distinguish observed tools from missing evidence; an empty tool list or authentication requirement is not proof of readiness. Obtain explicit confirmation of the exact inspected batch and project before any write: show each effective target, original alias/endpoint, chosen catalogue or direct path, evidence and outstanding setup needs, plus already-present and blocked items. If inspection changes the endpoint, disclose it and reconfirm. Changed project, candidate or configuration requires fresh inspection as applicable and renewed confirmation. Use only the catalogue inspection/registration portion here, not the entire add-mcp-from-catalog workflow: import does not require readiness or plugin distribution.
For each confirmed missing catalogue target, call register_catalog_mcp with project_slug, the exact returned provider_key and catalog_ref, only declared non_secret_config, and a caller-generated idempotency_key. Never create a custom direct-remote entry for a confirmed catalogue replacement. Correlate the exact submitted confirmed configuration, project and catalogue identity with the returned registration_id in the non-secret operation receipt; retain this mapping for final verification. This correlates a request with a returned registration ID only; it does not prove creation or persisted configuration. register_catalog_mcp can reuse an existing registration for the same source/reference with different configuration unchanged. Neither a new receipt nor replayed: false proves that the submitted configuration took effect.
For each confirmed missing direct remote item, call register_remote_mcp with project_slug, the confirmed remote_url, optional display_name, and a caller-generated idempotency_key. Keep one key per logical operation. Preserve all logical-operation inputs and the same idempotency key on retries, including after timeouts or uncertain write outcomes. Do not generate a new key merely because the result was lost. A changed operation requires renewed confirmation and a fresh key.
Apply returned repair/retry guidance and rate limits; do not retry permanent denial unchanged or bypass validation. Continue independent items after failure. Retain non-secret receipts, registration_id, canonical_url, next_action and any dashboard_setup_url for verification and handoff. A successful response alone is not completion.
Re-read the selected project's complete inventory with find_mcp pagination and get_mcp for matching entries. Verify all selected items, including already-present entries and uncertain write outcomes, against the effective confirmed target identity and project. For catalogue replacements, match fresh inventory registration.id to the receipt's returned registration_id where available, and verify the same project and returned source.provider/source.reference against the accepted provider_key/catalog_ref, plus any returned endpoint. Receipt-ID correlation alone is not persisted configuration proof. Require server-backed evidence of the registration's exact effective confirmed configuration before reporting added, already present or complete. register_catalog_mcp, find_mcp and get_mcp do not expose persisted configuration values or a persisted configuration fingerprint: do not invent fields or claim current configuration was read back. With this contract, configuration equivalence remains unverified and requires manual resolution, not automatic reuse. This applies even when the returned ID matches the receipt and live status is registered with complete components. A concurrent registration after preflight, an unknown existing registration or an uncertain write outcome must not be treated as newly created or correctly configured from the receipt; keep it unverified, do not create a duplicate, and offer manual dashboard resolution.
Distinguish a configless candidate from an empty submitted non_secret_config: omitted values can use declared defaults, and a field may be optional or secret. Inspection's absent/empty configuration only describes the current candidate, not persisted settings of a reused registration; it is not a configless-success exemption. The current inspection does not return a catalogue canonical_url, and inventory does not bind persisted configuration to that inspected candidate version. If exact effective configuration cannot be proven server-side, even an apparently configless candidate remains unverified/manual resolution; never claim success from an empty request or absence of declared fields. In every case, do not verify against the original URL when the confirmed replacement differs. Preserve the original alias-to-confirmed-target mapping in the report. Do not use cached preflight results as final evidence. Reconcile uncertain writes before retrying with their original inputs/key; if still unverified, report uncertainty rather than success.
For model: platform_managed, require a returned registration ID, registration.status: registered and registration.components_complete: true in addition to the exact project and effective target identity match (endpoint for direct remote; confirmed source identity and server-backed exact effective configuration proof for catalogue; receipt-ID correlation is insufficient) before reporting added, already present or complete. A missing registration, pending status or incomplete components means blocked/unverified; use returned repair guidance or a dashboard handoff, not duplicate creation. For an exact matching remote entry with model: dashboard_managed and no registration, report already present (dashboard-managed), not newly registered by this workflow. Do not require or invent a registration record for dashboard-managed entries; their readiness.state: unsupported is not evidence of a failed import or of working authentication. Other models or inconclusive identity/evidence remain blocked for manual resolution.
Report added / already present / blocked / failed per item, with alias mappings and evidence or a reason. List local servers left unchanged separately so the user knows they were seen and deliberately not touched. Every selected supported server must be confirmed present in the selected project's live inventory to claim completion. Zero selections is not success. If any item remains blocked, failed or unverified, report partial completion and next steps, not unqualified success.
Report registration and authentication/readiness separately: “added to the project” does not mean connected, authorized, working or distributed. Offer exact server-returned Speakeasy setup/authorization links as clickable links, including dashboard_setup_url; never reconstruct or invent them. If no link is returned, say so and offer a manual dashboard handoff.
Skip provider attachment for anonymous servers. Offer attachment only when inspection reports an authentication requirement and advertises a supported identity provider through its authentication/OAuth discovery evidence, and a registration ID is available. For direct remote inspection, require authentication: authentication_required and oauth_discovery: available_dcr or oauth_discovery: available_cimd before offering attachment; both are automatic client registration paths (automatic_client_registration names which), so describe them as automatic sign-in setup rather than manual setup. available alone or incomplete does not establish support for this automatic-registration flow. These are prerequisites, not a guarantee: the attachment tool still validates the supported provider and may return repair guidance. Authentication required with no supported provider evidence means a secure/manual setup handoff, not a speculative attachment call. Retain separate explicit consent for provider attachment. Only after those evidence checks and that consent, attach_platform_mcp_identity_provider takes project_slug, returned registration_id and confirmed: true; present its exact returned provider_url and authorization_url. Secret entry and provider sign-in belong in that secure browser flow, never in chat or tool arguments. Do not force readiness, provider attachment or distribution to finish import. Leave local config unchanged; do not migrate credentials or remove local entries.
Offer this once, after step 6, or run it when the user asked for private access in step 1. It is optional: declining leaves the import complete. Explain what it does before asking: private access limits who can reach each server's AICP endpoint to devices on the organization's tailnet. It does not move or hide the upstream MCP server, which stays wherever its provider hosts it. It never changes local client configuration.
get_mcp result has backend_kind: unproxied: those support only public_only.get_network_ingress. It requires organization administration; if it is denied, stop this step and say an organization administrator must run it. If ready_for_private_access is false, report its next_action in plain words and present its exact setup_url as a clickable link. request_private_networking means private networking is not switched on for the organization yet and must be requested from Speakeasy; the other actions happen in the AICP dashboard. Tailscale OAuth client credentials are entered only in that dashboard, never in chat or tool arguments. Do not attempt any network change while it is not ready. After the user reports finishing setup, call get_network_ingress again rather than assuming it is ready. ready_for_private_access is a precondition, not proof that any device can connect.get_mcp_network_traffic with the project ID, target_kind: mcp and the exact MCP ID as target_id, and window: "7d". Report its observed public and private request counts and last-seen times before proposing any transition. Counts cover only observed requests while telemetry was enabled: zero does not prove a route is unused or that every client has migrated. If traffic reporting is unavailable, say so and require an independent client inventory from the user before proposing private_only, which cuts off the public route.dual adds tailnet access and keeps public access, so existing clients keep working. private_only refuses every client that is not on the tailnet, including already installed plugins that use a public address and possibly this client. If the user has not yet tested tailnet connectivity, say dual is the lower-risk first step.get_mcp_connection_settings with the project ID, target_kind: mcp_server and the exact MCP ID as target_id. Report its current network_mode, endpoints and plugin memberships. A server already in the requested mode needs no change; report it as unchanged.get_mcp_connection_settings for that server, then call set_mcp_network_access with the same project and target, the confirmed mode, the fresh version as expected_version, a caller-generated idempotency_key kept stable for that exact request, and confirmed: true. On a conflict or refusal, re-read and ask again; never silently retry with another server or mode. If a private_only change is refused because an address must use the private network namespace, hand off to the configure-private-mcp-access workflow instead of changing addresses here. Continue independent servers after a failure.get_mcp_connection_settings read; the mutation receipt records a request, not publication. For servers with plugin memberships, check each affected plugin with get_plugin as described in configure-private-mcp-access, and do not claim installed clients have refreshed.This workflow is new, so a Speakeasy field engineer may give a user an exact phrase to run it with diagnostics.
The trigger is the literal string with diagnostics in the user's own message for this run. Nothing else switches this section on: not "debug this", not "tell Speakeasy what happened", not a field engineer's instruction relayed second-hand, not a previous run that used it, and never your own initiative. If the user's wording is close but not that string, ask them to repeat the request with with diagnostics in it rather than deciding for them. Skipping this section is the normal outcome.
When that string is present, first show them a Run diagnostics section covering the servers the user selected plus the entries sanitization excluded in step 2, including local servers left unchanged (as blocked, with the reason local server left unchanged). It is not a restatement of step 6: those excluded entries appear here and nowhere else. Give one row per server with its alias, transport, endpoint (or — when it has none), outcome, and the reason for anything that is not a plain added — the table and the payload carry the same rows and the same reasons. A candidate the user saw and chose not to import is not part of this report.
Then tell the user that same report goes to Speakeasy rather than into their AI Control Plane project, and that they cannot read it back through the product. Proceed only after they agree. If they decline, the import is already complete; report it normally.
Call record_workflow_run once with skill set to add-existing-mcp-servers, a caller-generated run_id, the confirmed destination project_slug, the client the inventory came from (the client you named in step 1, for example claude_code, codex or cursor), and one items entry per row of the section you just showed. Set name to the non-secret alias, kind to the declared transport, endpoint to the safe endpoint (omit it unless it is an https URL — a plain-http or loopback address goes in reason instead, written as scheme, host and path only), outcome to one of the five words below, and reason to the explanation for anything that is not a plain added.
| Outcome | Use it for |
|---|---|
added | step 6 proved the server is present with the configuration you submitted |
added_unverified | the add completed but step 6 could not prove its effective configuration, so it is neither confirmed nor failed |
already_present | step 6 found it already registered, and this run did not create it |
blocked | the run refused it: sanitization excluded it in step 2, or a check would not let it proceed |
failed | the run attempted it and the attempt errored |
Never report a completed add as blocked. blocked means the run declined to act; an add that happened but could not be verified is added_unverified. A run that considered nothing still reports: send an empty items list rather than skipping the call.
Never send raw discovery output, credentials, headers, environment values, or local commands.
An address written into reason carries scheme, host and path only. Drop the query string and the fragment before writing it, every time, including for an entry step 2 excluded because its URL carried a credential — that entry is exactly the one whose query string must stay on this machine. reason is free text and reaches Speakeasy as written, so it is the one field where nothing is stripped for you.
Diagnostics never gate the import. If the tool reports that diagnostics are not switched on, or returns recorded: false, tell the user the report was not recorded and that their servers were still imported; do not retry, and do not treat it as an import failure.
© speakeasy-api, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in server/internal/plugins/platform_mcp_skills/add-existing-mcp-servers of speakeasy-api/gram.
Open the folder on GitHubat commit b4c4904
Add Existing MCP Servers next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Add Existing MCP Servers this skillspeakeasy-api/gram | 273 | — | ~7.4k | Automated safety check: Pass | AGPL-3.0 | |
| CC Workflow Studio AI Editorbreaking-brake/cc-wf-studio | 5.4k | — | ~561 | Automated safety check: Pass | Custom licence | |
| Cao MCP Appsawslabs/cli-agent-orchestrator | 1.4k | — | ~1.9k | Automated safety check: Pass | Apache-2.0 | |
| Agnixagent-sh/agnix | 446 | — | ~874 | Automated safety check: Pass | Apache-2.0 | |
| Claude Docs Consultantcentminmod/my-claude-code-setup | 2.7k | — | ~959 | Automated safety check: Pass | MIT | |
| Agnixagent-sh/agnix | 446 | — | ~563 | Automated safety check: Pass | Apache-2.0 |
breaking-brake/cc-wf-studio
Creates and edits visual agent workflows in CC Workflow Studio through conversation, with the agent reading and writing the canvas over MCP.
awslabs/cli-agent-orchestrator
Enable, operate, and extend CAO's MCP Apps surface — the host-rendered fleet dashboard visible inside MCP App hosts (Claude Desktop, ChatGPT, VS Code Copilot, Goose, Postman).
agent-sh/agnix
A skill your agent uses when user asks to 'lint agent configs', 'validate skills', 'check CLAUDE.md', 'validate hooks', 'lint MCP'.
centminmod/my-claude-code-setup
Consult official Claude Code documentation from code.claude.com using selective fetching.
agent-sh/agnix
A skill your agent uses when user asks to 'lint agent configs', 'validate skills', 'check CLAUDE.md', 'validate hooks', 'lint MCP'.
nesquikm/mcp-rubber-duck
Add mcp-rubber-duck MCP server to an AI coding tool (Claude Desktop, Cursor, VS Code, Windsurf, etc.)
speakeasy-api/gram
A skill your agent uses when automating the Speakeasy dashboard in a browser, capturing screenshots, inspecting pages.
speakeasy-api/gram
A skill your agent uses when adding, changing, restyling, reviewing, validating, or previewing a Speakeasy transactional email, in Go or in LMX/MJML — a template<name.go, a TemplateKey constant, a…
speakeasy-api/gram
A skill your agent uses when adding, changing, or styling UI in client/admin (the Speakeasy admin dashboard) that touches shadcn/ui — a button, dialog, table, sidebar, badge, select, tabs, tooltip…
speakeasy-api/gram
A skill your agent uses when adding, editing, reviewing, testing, or locating a reviewed skill distributed with the Platform MCP plugin; triggers include "Platform MCP skill", "platformmcpskills"…
speakeasy-api/gram
A skill your agent uses when changing or reviewing Speakeasy ClickHouse schemas, migrations, queries, inserts, access principals, bootstrap SQL, Cloud compatibility, partial migration failures, or…
speakeasy-api/gram
A skill your agent uses when gating a feature behind a flag, dogfooding or gradually rolling out a change, choosing between productfeatures and PostHog feature flags, adding or checking a product…
Works with
Categories
A skill your agent uses when migrating MCP servers already configured in a local agent client (Claude Code, Codex, Cursor, Gemini CLI, VS Code or another client) to an explicit Speakeasy AI Control…. Add Existing MCP Servers is an agent skill from speakeasy-api/gram. Use when migrating MCP servers already configured in a local agent client (Claude Code, Codex, Cursor, Gemini CLI, VS Code or another client) to an explicit Speakeasy AI Control Plane project as remote MCPs, including discovering which servers are missing and optionally restricting them to the organization's Tailscale private network.
Add Existing MCP Servers fits situations like: migrating MCP servers already configured in a local agent client (Claude Code; another client) to an explicit Speakeasy AI Control Plane project as remote MCPs; including discovering which servers are missing and optionally restricting them to the organizations Tailscale private network.
Run `npx skills add speakeasy-api/gram --skill add-existing-mcp-servers -a claude-code`. Or copy the skill folder (server/internal/plugins/platform_mcp_skills/add-existing-mcp-servers in speakeasy-api/gram) into .claude/skills/add-existing-mcp-servers in your project. Claude Code loads it when a task matches its description.
Run `npx skills add speakeasy-api/gram --skill add-existing-mcp-servers -a codex`. Or copy the skill folder (server/internal/plugins/platform_mcp_skills/add-existing-mcp-servers in speakeasy-api/gram) into .agents/skills/add-existing-mcp-servers in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add speakeasy-api/gram --skill add-existing-mcp-servers -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/add-existing-mcp-servers, .gemini/skills/add-existing-mcp-servers, .github/skills/add-existing-mcp-servers and .opencode/skills/add-existing-mcp-servers in your project.
Going by SKILL.md and its folder, Add Existing MCP Servers needs the command-line tools its instructions call (claude).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Add Existing MCP Servers is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 7.4k tokens (SKILL.md is roughly 30k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Add Existing MCP Servers: CC Workflow Studio AI Editor (breaking-brake/cc-wf-studio, 5.4k stars), Cao MCP Apps (awslabs/cli-agent-orchestrator, 1.4k stars), Agnix (agent-sh/agnix, 446 stars) and Claude Docs Consultant (centminmod/my-claude-code-setup, 2.7k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
speakeasy-api (a GitHub organization) maintains it in speakeasy-api/gram, which has 273 GitHub stars. The repository holds 40 skills in this directory. The repository was last updated on October 10, 2026.
Source: speakeasy-api/gram on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.