MCP Server Builder
anthropics/skills
Guides the design and implementation of Model Context Protocol servers in TypeScript or Python, from tool naming and error messages to evaluation.
Put a newly published tool in front of people by adding it to one exact MCP server in an explicit AICP project, creating a new server from the project's function tools when none fits, or take a tool…
$ npx skills add speakeasy-api/gram --skill expose-tools-on-mcp -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install speakeasy-api/gram expose-tools-on-mcp --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/expose-tools-on-mcp .claude/skills/expose-tools-on-mcp && 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 "expose-tools-on-mcp" agent skill from https://github.com/speakeasy-api/gram/tree/main/server/internal/plugins/platform_mcp_skills/expose-tools-on-mcp into .claude/skills/expose-tools-on-mcp/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "expose-tools-on-mcp", 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/expose-tools-on-mcpType 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 expose-tools-on-mcp -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install speakeasy-api/gram expose-tools-on-mcp --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/expose-tools-on-mcp .agents/skills/expose-tools-on-mcp && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "expose-tools-on-mcp" agent skill from https://github.com/speakeasy-api/gram/tree/main/server/internal/plugins/platform_mcp_skills/expose-tools-on-mcp into .agents/skills/expose-tools-on-mcp/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "expose-tools-on-mcp", 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 expose-tools-on-mcp -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install speakeasy-api/gram expose-tools-on-mcp --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/expose-tools-on-mcp .cursor/skills/expose-tools-on-mcp && 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 "expose-tools-on-mcp" agent skill from https://github.com/speakeasy-api/gram/tree/main/server/internal/plugins/platform_mcp_skills/expose-tools-on-mcp into .cursor/skills/expose-tools-on-mcp/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "expose-tools-on-mcp", 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/expose-tools-on-mcp--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 expose-tools-on-mcp -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install speakeasy-api/gram expose-tools-on-mcp --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/expose-tools-on-mcp .gemini/skills/expose-tools-on-mcp && 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 "expose-tools-on-mcp" agent skill from https://github.com/speakeasy-api/gram/tree/main/server/internal/plugins/platform_mcp_skills/expose-tools-on-mcp into .gemini/skills/expose-tools-on-mcp/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "expose-tools-on-mcp", 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 expose-tools-on-mcpInstalls 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 expose-tools-on-mcp -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/expose-tools-on-mcp .github/skills/expose-tools-on-mcp && 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 "expose-tools-on-mcp" agent skill from https://github.com/speakeasy-api/gram/tree/main/server/internal/plugins/platform_mcp_skills/expose-tools-on-mcp into .github/skills/expose-tools-on-mcp/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "expose-tools-on-mcp", 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 expose-tools-on-mcp -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 expose-tools-on-mcp --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/expose-tools-on-mcp .opencode/skills/expose-tools-on-mcp && 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 "expose-tools-on-mcp" agent skill from https://github.com/speakeasy-api/gram/tree/main/server/internal/plugins/platform_mcp_skills/expose-tools-on-mcp into .opencode/skills/expose-tools-on-mcp/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "expose-tools-on-mcp", 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.
expose-tools-on-mcpPut a newly published tool in front of people by adding it to one exact MCP server in an explicit AICP project, creating a new server from the project's function tools when none fits, or take a tool…
Expose Tools On MCP is an agent skill from speakeasy-api/gram. Put a newly published tool in front of people by adding it to one exact MCP server in an explicit AICP project, creating a new server from the project's function tools when none fits, or take a tool back off, with confirmed and version-protected changes through the Speakeasy AI Control Plane Platform MCP.
Its SKILL.md is about 4.1k 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. 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.
11 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 1378037. 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.
No scripts in the folder and no shell commands in SKILL.md.
From 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.
Expose Tools On MCP loads about 4.1k tokens when it runs. Until then it costs about 82 tokens; SKILL.md has 2,617 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 1378037, republished under its AGPL-3.0 licence (© speakeasy-api). 2,617 words, ~4,057 tokens.
.claude/skills/expose-tools-on-mcp/SKILL.md (or your agent's skills folder).Use this workflow only through the authenticated Speakeasy AI Control Plane (AICP) Platform MCP connected as an external administrator. Publishing a tool to a project regenerates what the project can offer; it does not put that tool in front of anybody. Which tools one MCP server exposes is a separate, deliberate decision, and this workflow is how an administrator makes it: read the project's tools, read what the server exposes today, then add or remove named tools against the exact list that was read. When the project has no server that fits, the same workflow can create one whose tools are tools the project's functions already produce.
This is not the same as adding a server to a plugin. A plugin decides which servers people receive; this decides which tools one of those servers offers. For putting a whole server in front of people, use add-mcp-from-catalog, add-mcp-from-remote-url, or the plugin workflows instead.
It is not available to managed project assistants: the change reaches everyone holding an affected plugin the moment it commits, so it stays on the surface an administrator drives directly. Installing this package grants no organization or project access.
tool_exposure.tool_urns. Never type one out from a display name or from memory.confirmed: true only after the user has confirmed the exact server and the exact tools. Never send confirmed: true on the user's behalf.send_platform_mcp_feedback only after asking for consent, and never include identifiers, URLs, credentials, payloads, or logs.Call list_projects with limit: 100 to confirm the Platform MCP is authenticated and obtain the eligible projects. If authenticated discovery is unavailable, stop and ask the user to complete or repair AICP OAuth. If truncated: true, report that project discovery is incomplete and hand off to the AICP dashboard. Ask the user to choose one exact project.
Call list_project_tools for that exact project. Use query to narrow by tool name or by the function or API document that produced it, and follow every next_cursor with cursor and the same filters until the list is complete. Each entry names the tool, its exact identifier, and the source it came from, so the user can tell two similarly named tools apart. If a tool the user wants added is absent, report that the project's latest completed deployment does not produce it yet and stop; publishing again and waiting for that deployment to finish is the fix, not a different tool. For a removal, do not stop here: a tool the project no longer produces can still be on the server, so carry on through step 3 — the user still has to choose the exact server — and then take the exact identifier from that server's own tool_exposure.tool_urns in step 4.
Call find_mcp for that exact project with limit: 100, following every next_cursor with cursor and no query until the list is complete. Ask the user to choose one exact MCP server. Do not choose for them and do not assume there is only one. If the project has no server, or the user says none of them fits, offer to create one instead and follow the next paragraph; never create a server the user did not ask for.
Creating a server. This is for an addition only, and only from tools a function produced: every tool must come from list_project_tools with source_kind function. A tool generated from an API document cannot be used here; say so and point the user at the AICP dashboard. Ask the user for the new server's name. First call create_mcp_from_functions with the exact project ID, the name, the exact tool identifiers, one new idempotency key for this creation, and without confirmed: true; it creates and records nothing and answers confirmation_required with a preview. Never work out or describe a slug yourself. Show the user the preview values as returned before asking for confirmation: toolset_slug is exact, and mcp_slug_prefix is only the start of the server's address, because a short suffix is added at creation — say that, and never present the prefix as the full address. When preview.would_join_default_plugin is true, this would be the organization's first server: say plainly that it joins the project's Default plugin on creation, so everyone holding that plugin receives it. Present the exact project, the name, the preview, who will receive the server, and each tool by name and identifier, and ask for explicit confirmation. After they confirm, call create_mcp_from_functions again with the same project, name and tools, the same idempotency key the preview used, and confirmed: true. Use a new key only when starting a new attempt after a refusal. A refusal naming tools means nothing was created: those tools are not produced by the project's latest completed deployment, so return to step 2 rather than creating a server without them. A refusal saying the name is taken means nothing was created: ask the user for another name. On success, report the full mcp_slug the result returns and the returned exposure (a fresh read, not the list that was asked for), and read index_signal exactly as step 10 describes. Then say who receives the server from the result, never from the preview: when added_to_default_plugin is true, tell the user it joined the project's Default plugin and everyone holding that plugin receives it. publication_requested means a refresh of their plugin was requested, not confirmed delivered: never tell the user people already have the server. When added_to_default_plugin is false, say plainly that the new server reaches nobody until it is put into a plugin, and offer the plugin workflow as the next step. Skip steps 4 to 8 for a server you just created; it already exposes exactly the confirmed tools.
Call get_mcp with that project ID and that exact mcp_id. Read its tool_exposure. If tool_exposure is absent, this server's tools are not this project's to change: say so, point the user at the AICP dashboard, and stop. Otherwise present the tools it exposes today next to the tools the user wants added or removed, and say explicitly which of them are already in the requested state. When tool_exposure.next_tool_cursor is present, the list is only part of what the server exposes: call get_mcp again with the same project and server and tool_cursor set to it, and repeat until it is absent. Present the server's tools only once that read is complete. Keep tool_exposure.exposure_version from the page that completed the read internally; it describes the whole list and is the read this change will be checked against. A partial page carries no exposure version, so a change can never be confirmed against a list only partly read. A conflict while paging means the list changed mid-read: start again from the first page. When tool_exposure.truncated is true but no next_tool_cursor came back, the rest of the list cannot be read from this connection: say that the list shown is partial and that no change can be confirmed against it, stop before requesting confirmation or calling a mutation, and hand off to the AICP dashboard. Do not infer platform-tool absence, automatic-membership changes, or restored eligibility from a partial list.
Present the exact change and its reach before asking for confirmation: the project, the server, each tool by name and identifier, and every plugin listed in the server's distributions. State that the change requests republication of affected plugins: supported clients receive updates on their normal refresh cycle, while locally installed ZIPs require replacement. For removals, warn that people holding the listed plugins lose the removed tools when the change reaches them. Check the server’s current tool list as well as the requested edit: if the edited toolset still contains any platform tool, the entire toolset is excluded from automatic distribution and proven automatic role-plugin memberships are removed, even when the edit only adds ordinary tools. Explicit manual memberships and MCP access are preserved. Removing the last platform tool restores eligibility for automatic distribution while preserving prior removal history; do not promise previously removed memberships will be reattached. When tool_exposure.shared_with_other_servers is above zero, say how many other MCP servers offer this same set of tools and that the change moves all of them together; the change is allowed only with permission to change every one, and is refused outright otherwise. The count covers only servers in the chosen project, so a change can still be refused as shared beyond this workflow's reach even when it reads zero. Ask for explicit confirmation of that exact list.
After explicit confirmation, call add_tools_to_mcp — or remove_tools_from_mcp for a removal — with the exact project ID, the exact mcp_id, the exact tool identifiers, the exposure_version from the step-4 read, a fresh idempotency key, and confirmed: true. Send the identifiers exactly as they were returned — character for character from list_project_tools for an addition, or from the server's tool_exposure.tool_urns for a removal.
Read the result before reporting anything. outcome: applied with an empty unchanged means every named tool moved. outcome: applied with a non-empty unchanged is a partial result: name which tools moved and which were already in the requested state. outcome: no_op means nothing needed changing, so do not announce a change or a republish. exposure is a fresh read taken after the change committed; report that list, not the one that was asked for. When it carries next_tool_cursor, it is only the first page: read the rest through get_mcp with tool_cursor before reporting the full list. When snapshot_scope is not fresh_read_after_commit, the change committed but could not be read back: say that rather than claiming the final state.
A refusal naming tools means nothing was changed at all, not that part of the request landed. Present the named tools, explain that they are neither produced by this project nor already on the server, and return to step 2. A conflict means the server's tool list changed between the read and the write, so the change was refused to avoid overwriting somebody else's edit: return to step 4, present the list as it stands now, and ask the user to confirm again against it. Never reuse the old exposure version, and never retry with the same idempotency key and different tools. A refusal saying the tool list is shared beyond what this change can reach is the one refusal that does not return to a fresh read: it is about how the servers are set up, not about a race, so report it, point the user at the AICP dashboard, and stop. A rate-limit refusal is neither a race nor a dead end: nothing was changed and the same call will work later, so say that it was throttled and that the change has not been made, and repeat it unchanged only when the user asks you to — never on a timer of your own.
Report any removed_plugin_ids as plugins whose automatic membership this edit removed; distributions lists the remaining memberships. Report the publication outcome separately from the change. publication_request and publish_signal describe whether a package refresh was requested, not that plugins or the people holding them have converged. Verify with a fresh get_mcp if the user needs the settled state, and never claim people already have the tool unless the returned live state supports that.
Check index_signal on every applied change, and say something when it is neither requested nor not_required. A server set to dynamic tool selection cannot list any tools at all while its current tool list has no search index, so unavailable or request_failed means the change landed but that server may answer nothing for a few minutes until the platform rebuilds the index on its own. Tell the user plainly, say it is expected to recover without action, and point them at the AICP dashboard if it does not. Never present this as the change having failed — it did not — and never retry the mutation because of it.
Removal is the counterpart of the same design and follows exactly the same steps, with the same boundary as step 8, except that its identifiers may come from the server's exposed list rather than the project's. A name that is neither produced by this project's latest deployment nor already on this MCP server is refused by name, so a mistyped identifier is never mistaken for "already gone". A tool the project does produce but the server does not expose is not refused: it comes back as unchanged, because there was nothing to remove. Report that as "it was not on the server", never as a refusal. A tool the project no longer produces can still be removed, because the server is still offering it — so a removal never waits on a deployment, and never asks the user to publish a tool again in order to take it away.
© 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/expose-tools-on-mcp of speakeasy-api/gram.
Open the folder on GitHubat commit 1378037
Expose Tools On MCP 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 |
|---|---|---|---|---|---|---|
| Expose Tools On MCP this skillspeakeasy-api/gram | 273 | — | ~4.1k | Automated safety check: Pass | AGPL-3.0 | |
| MCP Server Builderanthropics/skills | 180k | 63 repos | ~2.3k | Automated safety check: Pass | Apache-2.0 | |
| MCP Server BuildershareAI-lab/learn-claude-code | 78k | 5 repos | ~1.2k | Automated safety check: Pass | MIT | |
| MCP Integration for Pluginsanthropics/claude-plugins-official | 38k | 11 repos | ~3.1k | Automated safety check: Pass | Apache-2.0 | |
| Crush Configurationcharmbracelet/crush | 29k | — | ~3.7k | Automated safety check: Pass | Custom licence | |
| Context Mode Output Sandboxmksglu/context-mode | 26k | — | ~4.1k | Automated safety check: Pass | Custom licence |
anthropics/skills
Guides the design and implementation of Model Context Protocol servers in TypeScript or Python, from tool naming and error messages to evaluation.
shareAI-lab/learn-claude-code
Walks through building MCP servers in Python or TypeScript that expose tools, resources and prompts to Claude, with templates, registration and testing.
anthropics/claude-plugins-official
Explains how to bundle Model Context Protocol servers in a Claude Code plugin, covering config files, stdio, SSE, HTTP and WebSocket server types, and authentication.
charmbracelet/crush
Explains how to configure the Crush coding agent with crushrc or crush.json, covering providers, models, LSPs, MCP servers, hooks, permissions and config precedence.
mksglu/context-mode
Routes large command, file, API and browser output through context-mode tools so only the needed result enters the agent's context, instead of dumping it via Bash.
warpdotdev/warp
Migrates the compatible subset of settings and global file-based MCP servers from the Warp desktop app into Warp Agent CLI without exposing credentials or state.
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
Put a newly published tool in front of people by adding it to one exact MCP server in an explicit AICP project, creating a new server from the project's function tools when none fits, or take a tool…. Expose Tools On MCP is an agent skill from speakeasy-api/gram. Put a newly published tool in front of people by adding it to one exact MCP server in an explicit AICP project, creating a new server from the project's function tools when none fits, or take a tool back off, with confirmed and version-protected changes through the Speakeasy AI Control Plane Platform MCP.
Expose Tools On MCP fits situations like: tasks that involve MCP servers.
Run `npx skills add speakeasy-api/gram --skill expose-tools-on-mcp -a claude-code`. Or copy the skill folder (server/internal/plugins/platform_mcp_skills/expose-tools-on-mcp in speakeasy-api/gram) into .claude/skills/expose-tools-on-mcp in your project. Claude Code loads it when a task matches its description.
Run `npx skills add speakeasy-api/gram --skill expose-tools-on-mcp -a codex`. Or copy the skill folder (server/internal/plugins/platform_mcp_skills/expose-tools-on-mcp in speakeasy-api/gram) into .agents/skills/expose-tools-on-mcp 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 expose-tools-on-mcp -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/expose-tools-on-mcp, .gemini/skills/expose-tools-on-mcp, .github/skills/expose-tools-on-mcp and .opencode/skills/expose-tools-on-mcp in your project.
SKILL.md names no scripts, command-line tools or credentials: Expose Tools On MCP is instructions for the agent only.
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.
Expose Tools On MCP 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 4.1k tokens (SKILL.md is roughly 16k 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 Expose Tools On MCP: MCP Server Builder (anthropics/skills, 180k stars), MCP Server Builder (shareAI-lab/learn-claude-code, 78k stars), MCP Integration for Plugins (anthropics/claude-plugins-official, 38k stars) and Crush Configuration (charmbracelet/crush, 29k 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 39 skills in this directory. The repository was last updated on October 9, 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.