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.
Scaffold a new CLI action for this SDK repository. An agent skill from phantom/phantom-connect-sdk.
$ npx skills add phantom/phantom-connect-sdk --skill new-cli-action -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install phantom/phantom-connect-sdk new-cli-action --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/phantom/phantom-connect-sdk.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/new-cli-action .claude/skills/new-cli-action && 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 "new-cli-action" agent skill from https://github.com/phantom/phantom-connect-sdk/tree/main/.claude/skills/new-cli-action into .claude/skills/new-cli-action/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "new-cli-action", 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/phantom/phantom-connect-sdk/tree/main/.claude/skills/new-cli-actionType 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 phantom/phantom-connect-sdk --skill new-cli-action -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install phantom/phantom-connect-sdk new-cli-action --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/phantom/phantom-connect-sdk.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/new-cli-action .agents/skills/new-cli-action && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "new-cli-action" agent skill from https://github.com/phantom/phantom-connect-sdk/tree/main/.claude/skills/new-cli-action into .agents/skills/new-cli-action/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "new-cli-action", 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 phantom/phantom-connect-sdk --skill new-cli-action -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install phantom/phantom-connect-sdk new-cli-action --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/phantom/phantom-connect-sdk.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/new-cli-action .cursor/skills/new-cli-action && 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 "new-cli-action" agent skill from https://github.com/phantom/phantom-connect-sdk/tree/main/.claude/skills/new-cli-action into .cursor/skills/new-cli-action/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "new-cli-action", 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/phantom/phantom-connect-sdk.git --path .claude/skills/new-cli-action--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 phantom/phantom-connect-sdk --skill new-cli-action -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install phantom/phantom-connect-sdk new-cli-action --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/phantom/phantom-connect-sdk.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/new-cli-action .gemini/skills/new-cli-action && 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 "new-cli-action" agent skill from https://github.com/phantom/phantom-connect-sdk/tree/main/.claude/skills/new-cli-action into .gemini/skills/new-cli-action/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "new-cli-action", 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 phantom/phantom-connect-sdk new-cli-actionInstalls 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 phantom/phantom-connect-sdk --skill new-cli-action -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/phantom/phantom-connect-sdk.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/new-cli-action .github/skills/new-cli-action && 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 "new-cli-action" agent skill from https://github.com/phantom/phantom-connect-sdk/tree/main/.claude/skills/new-cli-action into .github/skills/new-cli-action/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "new-cli-action", 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 phantom/phantom-connect-sdk --skill new-cli-action -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install phantom/phantom-connect-sdk new-cli-action --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/phantom/phantom-connect-sdk.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/new-cli-action .opencode/skills/new-cli-action && 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 "new-cli-action" agent skill from https://github.com/phantom/phantom-connect-sdk/tree/main/.claude/skills/new-cli-action into .opencode/skills/new-cli-action/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "new-cli-action", 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.
new-cli-actionScaffold a new CLI action for this SDK repository. An agent skill from phantom/phantom-connect-sdk.
New CLI Action is an agent skill from phantom/phantom-connect-sdk. Scaffold a new CLI action for this SDK repository. Use when the user asks to add a new command, tool, or action to the Phantom CLI/MCP. Guides through creating the action file, registering the command in the appropriate CLI group, and adding the tool to the OpenClaw registry.
Its SKILL.md is about 3k 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: Multi-platform SDKs for integrating Phantom. The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit daa18ef. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadWriteEditBashAgentFrom allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npxFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
github.comFrom 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.
New CLI Action loads about 3k tokens when it runs. Until then it costs about 73 tokens; SKILL.md has 787 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 noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Read, Write, Edit, Bash, AgentAutomated 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 phantom/phantom-connect-sdk at commit daa18ef, republished under its MIT licence (© phantom). 787 words, ~3,019 tokens.
.claude/skills/new-cli-action/SKILL.md (or your agent's skills folder).Arguments passed: $ARGUMENTS
You are helping the user add a new command to the Phantom CLI (packages/cli). Every action is automatically exposed in three places: the CLI binary, the MCP server, and OpenClaw. All three come for free from a single createAction call — the user only needs to write one file and make two registration edits.
Framework: The CLI is built on incur, a TypeScript framework for building CLIs that work as both binaries and MCP servers. The
Cliandzimports in every action file come fromincur. If you need deeper guidance on incur patterns — schemas, Cli APIs, or advanced usage — runnpx incur skills addin the project root to pull the official incur skill into Claude Code and piggyback off it.
If $ARGUMENTS is empty or vague, ask the user:
phantom buy, or under a sub-group like phantom perps open)If $ARGUMENTS describes the command well enough, proceed directly.
The CLI is structured as follows. Read packages/cli/src/index.ts and the relevant command file to confirm the current shape before writing anything.
| CLI path | Command file | Action files |
|---|---|---|
phantom <cmd> | src/index.ts (registered directly) | src/actions/<name>.ts |
phantom wallet <cmd> | src/commands/wallet.ts | src/actions/<name>.ts |
phantom solana <cmd> | src/commands/solana.ts | src/actions/<name>.ts |
phantom evm <cmd> | src/commands/evm.ts | src/actions/<name>.ts |
phantom perps <cmd> | src/commands/perps.ts | src/actions/<name>.ts |
phantom token <cmd> | src/commands/token.ts | src/actions/<name>.ts |
If the command belongs to a new group that doesn't have a command file yet, create src/commands/<group>.ts following the pattern of an existing one (e.g. wallet.ts), then register <group>Cli in src/index.ts.
Decide the kebab-case filename: src/actions/<verb>-<noun>.ts (e.g. get-perp-account.ts, send-evm-transaction.ts).
Create packages/cli/src/actions/<name>.ts using the template below. Fill every section — do not leave TODOs or placeholders.
/**
* <mcp_command_name> tool
*
* <One or two sentences describing what this action does and any important
* preconditions (e.g. "Wallet must hold USDC in the perps account").>
*/
import { Cli, z } from "incur";
import { createAction } from "../utils/actions.js";
// Import helpers as needed:
// Session/wallet: import { WalletIdSchema, DerivationIndexSchema } from "../utils/schemas.js";
// Solana address: import { getSolanaAddress } from "../utils/solana.js";
// EVM address: import { getEthereumAddress } from "../utils/evm.js";
// Perps client: import { createPerpsClient } from "../utils/perps.js";
// Shared schemas: import { ActionResponseSchema, PendingConfirmationSchema } from "../utils/output-schemas.js";
const <PascalName>Schema = z.object({
// Each field needs a .describe() explaining its purpose and any defaults.
// Always include these at the bottom if the action touches the wallet:
// walletId: WalletIdSchema.describe("Optional wallet ID (defaults to authenticated wallet)"),
// derivationIndex: DerivationIndexSchema.describe("Optional derivation index (default: 0)"),
});
const <PascalName>OutputSchema = z.object({
// Define every field the run() function returns.
// Use z.string().nullable() when a field can be null.
// Use .optional() for fields that are sometimes absent.
});
const <camelName>Action = createAction({
// description: Shown to the LLM agent. Should be detailed enough that the
// agent knows when and how to use this tool. Include:
// - What it does
// - Any required preconditions
// - What the success response looks like
// - Any important defaults or two-step flow notes
description:
"Phantom Wallet — <detailed description>.",
options: <PascalName>Schema,
output: <PascalName>OutputSchema,
mcp: {
// command: The MCP/RPC method name. Use snake_case. Should be more
// descriptive than the CLI sub-command name because MCP tools are flat
// (no nesting), e.g. "get_perp_account" not just "account".
command: "<snake_case_mcp_name>",
annotations: {
// readOnlyHint: true → no side effects (reads only)
// readOnlyHint: false → has side effects (writes, transactions)
readOnlyHint: <true|false>,
// destructiveHint: true → irreversible (sends tx, deletes data)
destructiveHint: <true|false>,
// openWorldHint: true → makes network/external calls
openWorldHint: <true|false>,
},
},
run: async ({ options: params, var: context }) => {
const { logger } = context;
const session = context.manager.getSession();
// context.manager.getClient() → PhantomClient (sign, send, addresses)
// context.apiClient → PhantomApiClient (REST endpoints)
// session.walletId → currently authenticated wallet ID
// session.organizationId → org ID for the current session
// A session is automatically initialized on first use and persisted
// across calls — no manual session management required.
// ... implementation ...
return { /* must match <PascalName>OutputSchema */ };
},
});
export const <camelName>Command = Cli.create("<cli-subcommand>", <camelName>Action.command);
export const <camelName>Tool = <camelName>Action.tool;description on every input field — each z.* field must have .describe(...). Include the default value in the description text if one exists (e.g. "Default: false.").output: z.any() — always define a concrete output schema.mcp.command vs CLI sub-command — the MCP command name is flat and globally unique (get_perp_account); the CLI sub-command is the leaf word under its group (account under phantom perps).readOnlyHint: true only for pure reads with no side effects.src/utils/output-schemas.ts and import it. Otherwise define it inline.ActionResponseSchema — use for any Hyperliquid write operation that returns { status, data? }.PendingConfirmationSchema — use in a union for two-step flows (simulate first, then confirm).Open the relevant command file and add one import + one .<command>() call.
Example — adding to perps:
// In src/commands/perps.ts
import { <camelName>Command } from "../actions/<name>.js";
// ...
perpsCli.command(<camelName>Command);Example — adding top-level to src/index.ts:
import { <camelName>Command } from "./actions/<name>.js";
// ...
cli.command(<camelName>Command);Open src/tools/index.ts, add the import, and add the tool to the tools array in the appropriate section:
import { <camelName>Tool } from "../actions/<name>.js";
export const tools: ToolHandler[] = [
// ... existing tools ...
<camelName>Tool, // add in the logical group (wallet / solana / evm / perps read / perps write)
];Run the TypeScript check to confirm zero errors:
cd packages/cli && npx tsc --noEmitIf there are type errors, fix them before reporting the work as done. Common issues:
run() doesn't match <PascalName>OutputSchema — check every return path.z.string().nullable() needed where the value can be null.as const on literal returns inside discriminated unions.Four places need updating. Do all four before reporting done.
packages/cli/src/index.ts — MCP_INSTRUCTIONSAdd the new tool to the Available tools: sentence in MCP_INSTRUCTIONS:
"<mcp_command> (<one-line description>), " +packages/cli/README.md| \<mcp_name>` | <description> |` in the logical group.packages/mcp-server/README.mdAdd a row to the relevant tools table (or a new table + heading for a new category):
| `<mcp_name>` | <One-sentence description.> |packages/phantom-openclaw-plugin/README.mdAdd a full tool entry in the Available Tools section following the existing pattern:
### `<mcp_name>`
<Two-sentence description: what it does and when to use it.>
**Parameters:**
- `<param>` (<type>, required/optional): <description>
**Example:**
\`\`\`json
{ "<param>": "<value>" }
\`\`\`
**Response:** `{ <key fields> }`context.logger; // Logger — .info(), .warn(), .error(), .debug()
context.apiClient; // PhantomApiClient — Phantom REST endpoints
context.manager.getClient(); // PhantomClient — KMS signing, wallet ops
context.manager.getSession(); // { walletId, organizationId }
context.manager.isInitialized(); // boolean — false if not yet authedA session is initialized on first use (triggering the browser auth flow) and persisted automatically. The createAction wrapper handles AUTH_EXPIRED by resetting the session and surfacing a clear error — no manual handling needed.
| Helper | Import path | When to use |
|---|---|---|
getSolanaAddress(context, walletId, derivationIndex) | ../utils/solana.js | Derive Solana public key |
getEthereumAddress(context, walletId, derivationIndex) | ../utils/evm.js | Derive EVM address |
createPerpsClient(context, walletId, derivationIndex?) | ../utils/perps.js | All Hyperliquid perps ops |
normalizeNetworkId(id) | ../utils/network.js | Normalise CAIP-2 chain IDs |
parseBaseUnitAmount(amount) | ../utils/amount.js | String/number → bigint base units |
parseUiAmount(amount, decimals) | ../utils/amount.js | UI units → bigint base units |
runSimulation(body, context) | ../utils/simulation.js | Simulate before submitting |
WalletIdSchema | ../utils/schemas.js | Optional wallet ID input field |
DerivationIndexSchema | ../utils/schemas.js | Optional HD index input field |
Caip2ChainIdSchema | ../utils/schemas.js | CAIP-2 chain ID input field |
© phantom, MIT. 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 .claude/skills/new-cli-action of phantom/phantom-connect-sdk.
Open the folder on GitHubat commit daa18ef
New CLI Action 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 |
|---|---|---|---|---|---|---|
| New CLI Action this skillphantom/phantom-connect-sdk | 162 | — | ~3k | Automated safety check: Notes | MIT | |
| MCP Server Builderanthropics/skills | 180k | 62 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 | 37k | 11 repos | ~3.1k | Automated safety check: Pass | Apache-2.0 | |
| Fastmcp Client CLIPrefectHQ/fastmcp | 28k | 1 repos | ~823 | Automated safety check: Pass | Apache-2.0 | |
| Crush Configurationcharmbracelet/crush | 29k | — | ~3.7k | 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.
PrefectHQ/fastmcp
Query and invoke tools on MCP servers using fastmcp list and fastmcp call.
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.
phantom/phantom-connect-sdk
Phantom wallet connected. An agent skill from phantom/phantom-connect-sdk.
Works with
Categories
Scaffold a new CLI action for this SDK repository. An agent skill from phantom/phantom-connect-sdk. New CLI Action is an agent skill from phantom/phantom-connect-sdk. Scaffold a new CLI action for this SDK repository.
New CLI Action fits situations like: the user asks to add a new command; action to the Phantom CLI/MCP.
Run `npx skills add phantom/phantom-connect-sdk --skill new-cli-action -a claude-code`. Or copy the skill folder (.claude/skills/new-cli-action in phantom/phantom-connect-sdk) into .claude/skills/new-cli-action in your project. Claude Code loads it when a task matches its description.
Run `npx skills add phantom/phantom-connect-sdk --skill new-cli-action -a codex`. Or copy the skill folder (.claude/skills/new-cli-action in phantom/phantom-connect-sdk) into .agents/skills/new-cli-action 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 phantom/phantom-connect-sdk --skill new-cli-action -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/new-cli-action, .gemini/skills/new-cli-action, .github/skills/new-cli-action and .opencode/skills/new-cli-action in your project.
Going by SKILL.md and its folder, New CLI Action needs the command-line tools its instructions call (npx). Our summary lists: Node.js. Its frontmatter pre-approves these tools: Read, Write, Edit, Bash, Agent.
SKILL.md names 1 domain. As links in the text: github.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
New CLI Action is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3k tokens (SKILL.md is roughly 12k 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 New CLI Action: 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, 37k stars) and Fastmcp Client CLI (PrefectHQ/fastmcp, 28k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
phantom (a GitHub organization) maintains it in phantom/phantom-connect-sdk, which has 162 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on October 5, 2026.
Source: phantom/phantom-connect-sdk on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.