npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

mcp2scripts

v0.3.1

Published

Generate JavaScript scripts from MCP Server Tools for Claude Code Skills to use

Readme

mcp2scripts

Generate JavaScript scripts from MCP Server Tools for Claude Code Skills.

mcp2scripts queries your local mcp2rest service and generates executable JavaScript scripts for each MCP tool, packaged as Claude Code skills.

Features

  • Zero-config skill generation - Generate skills with a single command
  • Full MCP protocol support - Works with any MCP server via mcp2rest
  • Type-safe CLI generation - Converts JSON Schema to commander.js options
  • Interactive help - Every tool script includes --help documentation
  • State management - Scripts share server state through mcp2rest
  • Categorized tools - Automatically organizes tools by functionality

Installation

npm install -g mcp2scripts

Or use with npx:

npx mcp2scripts servers

Prerequisites

  1. Node.js >= 18.0.0
  2. mcp2rest service running (default: http://localhost:28888)

Quick Start

# 1. List available MCP servers
mcp2scripts servers

# 2. Generate skill for a specific server (creates in project folder ./.claude/skills)
mcp2scripts generate chrome-devtools

# 3. Or generate in user folder with --user flag
mcp2scripts generate chrome-devtools --user

# 4. Skills are created in ./.claude/skills/mcp-{server-name}/ or ~/.claude/skills/mcp-{server-name}/
# 5. Claude Code automatically discovers skills in both locations

CLI Usage

List Servers

Show all MCP servers loaded in mcp2rest:

mcp2scripts servers

# Use custom mcp2rest endpoint
mcp2scripts servers --endpoint http://192.168.1.100:28888

Output:

Available servers in mcp2rest (http://localhost:28888):

  ✓ chrome-devtools
    Status: connected
    Tools: 15
    Transport: stdio
    Package: @modelcontextprotocol/server-chrome-devtools

  ✓ filesystem
    Status: connected
    Tools: 8
    Transport: stdio
    Package: @modelcontextprotocol/server-filesystem

Generate Skills

Generate a skill for a specific server:

# Generate skill for chrome-devtools (default: project folder)
mcp2scripts generate chrome-devtools

# Generate to user folder
mcp2scripts generate chrome-devtools --user

# Generate to custom directory
mcp2scripts generate chrome-devtools -o ./my-skills

# Generate skills for all connected servers
mcp2scripts generate --all

# Use custom mcp2rest endpoint
mcp2scripts generate chrome-devtools --endpoint http://192.168.1.100:28888

Output:

Generating skill for 'chrome-devtools'...
mcp2rest: http://localhost:28888
Output: ./.claude/skills

✓ Generated skill: ./.claude/skills/mcp-chrome-devtools
  SKILL.md: ./.claude/skills/mcp-chrome-devtools/SKILL.md
  Scripts: 15 tools + 1 shared client

Next steps:
  1. Navigate to skill directory and run: npm install
  2. Run scripts: node scripts/tool_name.js --help
  3. Claude Code will auto-discover skills from project .claude/skills/ or user ~/.claude/skills/

List Tools

Show tools available on a server:

mcp2scripts tools chrome-devtools

Output:

Tools for 'chrome-devtools' (15 total):

  navigate
    Navigate to a URL in the current page
    Required: url

  click
    Click an element on the page
    Required: selector

  screenshot
    Take a screenshot of the page
    Optional: fullPage

Generated Skill Structure

Default (project folder):

./.claude/skills/mcp-{server-name}/
├── SKILL.md              # Skill documentation
└── scripts/
    ├── package.json      # Dependencies (axios, commander)
    ├── mcp_client.js     # Shared REST client
    ├── tool1.js          # Generated script for tool1
    ├── tool2.js          # Generated script for tool2
    └── ...

With --user flag:

~/.claude/skills/mcp-{server-name}/
├── SKILL.md              # Skill documentation
└── scripts/
    ├── package.json      # Dependencies (axios, commander)
    ├── mcp_client.js     # Shared REST client
    ├── tool1.js          # Generated script for tool1
    ├── tool2.js          # Generated script for tool2
    └── ...

SKILL.md

Contains:

  • YAML frontmatter with skill metadata
  • Tool categorization (Page Management, Inspection, etc.)
  • Usage examples
  • Troubleshooting tips

Tool Scripts

Each tool gets an executable JavaScript script with:

  • #!/usr/bin/env node shebang
  • Commander.js CLI with --help support
  • Type-safe argument parsing (JSON Schema → CLI options)
  • Required field validation
  • JSON parsing for complex types
  • Error handling

Example generated script:

#!/usr/bin/env node
import { program } from 'commander';
import { callTool } from './mcp_client.js';

program
  .name('navigate')
  .description('Navigate to a URL in the current page')
  .option('--url <value>', 'URL to navigate to (string)')
  .parse();

const options = program.opts();

if (!options.url) {
  console.error('Error: --url is required');
  process.exit(1);
}

const args = {
  url: options.url,
};

const result = await callTool('chrome-devtools', 'navigate', args);
console.log(result);

Programmatic API

You can also use mcp2scripts as a library:

import { ScriptGenerator } from 'mcp2scripts';

const gen = new ScriptGenerator('http://localhost:28888');

// List servers
const servers = await gen.listServers();
console.log(servers);

// Get tools for a server
const tools = await gen.getTools('chrome-devtools');
console.log(tools);

// Generate skill (default: ./.claude/skills)
const result = await gen.generateSkill('chrome-devtools');
console.log(`Generated ${result.toolCount} tools at ${result.skillPath}`);

// Generate to user folder
const resultUser = await gen.generateSkill('chrome-devtools', '~/.claude/skills');

// Generate all skills
const results = await gen.generateAllSkills();
console.log(`Generated ${results.length} skills`);

API Reference

new ScriptGenerator(mcp2restUrl?: string)

Create a new script generator.

  • mcp2restUrl - Base URL of mcp2rest service (default: http://localhost:28888)

async listServers(): Promise<ServerInfo[]>

Get all servers from mcp2rest.

Returns array of server info objects:

{
  name: string;
  status: 'connected' | 'disconnected' | 'error';
  toolCount?: number;
  transport?: string;
  package?: string;
  url?: string;
}

Throws MCPConnectionError if cannot connect to mcp2rest.

async getTools(serverName: string): Promise<Tool[]>

Get tool schemas for a server.

Returns array of tool objects:

{
  name: string;
  description?: string;
  inputSchema?: JsonSchema;
}

Throws Error if server not found.

async generateSkill(serverName: string, outputDir?: string): Promise<GenerateSkillResult>

Generate a Claude Code skill for an MCP server.

  • serverName - Name of the MCP server
  • outputDir - Output directory (default: ./.claude/skills)

Returns:

{
  skillPath: string;        // Path to generated skill directory
  serverName: string;       // Name of server
  toolCount: number;        // Number of tools generated
  scriptsCreated: string[]; // List of script filenames
}

async generateAllSkills(outputDir?: string): Promise<GenerateSkillResult[]>

Generate skills for all connected servers with tools.

Returns array of GenerateSkillResult objects.

Configuration

Environment Variables

  • MCP_REST_URL - Override mcp2rest endpoint in generated scripts

Example:

# Generate skill with default endpoint
mcp2scripts generate chrome-devtools

# Later, override at runtime
MCP_REST_URL=http://192.168.1.100:28888 node scripts/navigate.js --url https://example.com

Custom mcp2rest Endpoint

Use the --endpoint flag with any command:

mcp2scripts servers --endpoint http://custom-host:8080
mcp2scripts generate chrome-devtools --endpoint http://custom-host:8080

Using Generated Skills

With Claude Code

Claude Code automatically discovers skills in both ./.claude/skills/ (project) and ~/.claude/skills/ (user):

  1. Generate skills: mcp2scripts generate --all (creates in project folder)
  2. Or generate in user folder: mcp2scripts generate --all --user
  3. Start Claude Code
  4. Skills are available immediately

Manual Usage

Run tool scripts directly:

cd ./.claude/skills/mcp-chrome-devtools/scripts

# Install dependencies (first time only)
npm install

# Get help
node navigate.js --help

# Navigate to URL
node navigate.js --url https://example.com

# Take screenshot
node screenshot.js --full-page

# Click element
node click.js --selector "#login-button"

Chaining Commands

All scripts use the same server instance (via mcp2rest):

# Navigate to page
node navigate.js --url https://github.com

# Fill in search box
node fill.js --selector "input[name=q]" --value "mcp2scripts"

# Submit form
node click.js --selector "button[type=submit]"

# Take screenshot
node screenshot.js --full-page

Troubleshooting

"Cannot connect to mcp2rest"

  1. Check mcp2rest is running:

    curl http://localhost:28888/health
  2. Verify correct endpoint:

    mcp2scripts servers --endpoint http://localhost:28888
  3. Check firewall settings if using remote endpoint

"Server not found"

  1. List available servers:

    mcp2scripts servers
  2. Verify server name matches exactly (case-sensitive)

  3. Check server is connected (not disconnected)

"No tools available"

  1. Check server status:

    mcp2scripts tools server-name
  2. Verify server has initialized properly in mcp2rest

  3. Check server logs for initialization errors

Script Errors

  1. Use --help to see required arguments:

    node scripts/tool-name.js --help
  2. Check argument types (string, number, boolean, object)

  3. For object arguments, provide valid JSON:

    node configure.js --settings '{"theme":"dark","timeout":5000}'

Examples

Example 1: Browser Automation

# Generate chrome-devtools skill
mcp2scripts generate chrome-devtools

cd ./.claude/skills/mcp-chrome-devtools/scripts

# Install dependencies
npm install

# Navigate to page
node navigate.js --url https://example.com

# Take screenshot
node screenshot.js --full-page

# Get console logs
node get_console_logs.js

Example 2: File System Operations

# Generate filesystem skill
mcp2scripts generate filesystem

cd ./.claude/skills/mcp-filesystem/scripts

# Install dependencies
npm install

# List directory
node list_directory.js --path /tmp

# Read file
node read_file.js --path /tmp/test.txt

# Write file
node write_file.js --path /tmp/output.txt --content "Hello World"

Example 3: Multi-Server Workflow

# Generate all skills
mcp2scripts generate --all

# Use browser to fetch data
cd ./.claude/skills/mcp-chrome-devtools/scripts
node navigate.js --url https://api.example.com/data.json
node screenshot.js --full-page > data.png

# Save to file
cd ./.claude/skills/mcp-filesystem/scripts
node write_file.js --path /tmp/data.png --content-from-stdin < ~/data.png

Development

# Clone repository
git clone https://github.com/ulasbilgen/mcp2skill-tools.git
cd mcp2skill-tools/packages/mcp2scripts

# Install dependencies
npm install

# Run tests
npm test

# Build
npm run build

# Run CLI locally
node dist/cli.js servers

TypeScript

Full TypeScript support with exported types:

import type { ServerInfo, Tool, JsonSchema, GenerateSkillResult } from 'mcp2scripts';

Contributing

Contributions welcome! See CONTRIBUTING.md.

License

MIT License - see LICENSE

Related Projects

Changelog

See CHANGELOG.md for release history.