home / skills / jezweb / claude-skills / ts-agent-sdk

ts-agent-sdk skill

/skills/ts-agent-sdk

This skill generates typed TypeScript SDKs for MCP tools, converting JSON-RPC patterns into clean, reusable client methods for AI agents.

npx playbooks add skill jezweb/claude-skills --skill ts-agent-sdk

Review the files below or copy the command above to add this skill to your agents.

Files (19)
SKILL.md
5.2 KB
---
name: ts-agent-sdk
description: |
  Generate typed TypeScript SDKs for AI agents to interact with MCP servers. Converts JSON-RPC curl commands to clean function calls. Auto-generates types, client methods, and example scripts from MCP tool definitions.

  Use when building MCP-enabled applications, need typed programmatic access to MCP tools, or creating reusable agent automation scripts.
user-invocable: true
---

# ts-agent-sdk

## Overview

This skill generates typed TypeScript SDKs that allow AI agents (primarily Claude Code) to interact with web applications via MCP servers. It replaces verbose JSON-RPC curl commands with clean function calls.

## Template Location

The core SDK template files are bundled with this skill at:
`templates/`

Copy these files to the target project's `scripts/sdk/` directory as a starting point:

```bash
cp -r ~/.claude/skills/ts-agent-sdk/templates/* ./scripts/sdk/
```

## SDK Generation Workflow

### Step 1: Detect MCP Servers

Scan the project for MCP server modules:
```
src/server/modules/mcp*/server.ts
```

Each server.ts file contains tool definitions using the pattern:
```typescript
server.tool(
  'tool_name',
  'Tool description',
  zodInputSchema,
  async (params) => { ... }
)
```

### Step 2: Extract Tool Definitions

For each tool, extract:
1. **name**: The tool identifier (e.g., 'create_document')
2. **description**: Tool description for JSDoc
3. **inputSchema**: Zod schema defining input parameters
4. **endpoint**: The MCP endpoint path (e.g., '/api/mcp-docs/message')

### Step 3: Generate TypeScript Interfaces

Convert Zod schemas to TypeScript interfaces:

```typescript
// From: z.object({ name: z.string(), email: z.string().email() })
// To:
export interface CreateEnquiryInput {
  name: string;
  email: string;
}
```

### Step 4: Generate Module Client

Create a client class with methods for each tool:

```typescript
// scripts/sdk/docs/client.ts
import { MCPClient, defaultClient } from '../client';
import type { CreateDocumentInput, CreateDocumentOutput } from './types';

const ENDPOINT = '/api/mcp-docs/message';

export class DocsClient {
  private mcp: MCPClient;

  constructor(client?: MCPClient) {
    this.mcp = client || defaultClient;
  }

  async createDocument(input: CreateDocumentInput): Promise<CreateDocumentOutput> {
    return this.mcp.callTool(ENDPOINT, 'create_document', input);
  }

  async listDocuments(input: ListDocumentsInput): Promise<ListDocumentsOutput> {
    return this.mcp.callTool(ENDPOINT, 'list_documents', input);
  }

  // ... one method per tool
}

export const docs = new DocsClient();
```

### Step 5: Generate Example Scripts

Create runnable examples in `scripts/sdk/examples/`:

```typescript
#!/usr/bin/env npx tsx
// scripts/sdk/examples/create-doc.ts
import { docs } from '../';

async function main() {
  const result = await docs.createDocument({
    spaceId: 'wiki',
    title: 'Getting Started',
    content: '# Welcome\n\nThis is the intro.',
  });

  console.log(`Created document: ${result.document.id}`);
}

main().catch(console.error);
```

### Step 6: Update Index Exports

Add module exports to `scripts/sdk/index.ts`:

```typescript
export { docs } from './docs';
export { enquiries } from './enquiries';
```

## Output Structure

```
project/
└── scripts/sdk/
    ├── index.ts           # Main exports
    ├── config.ts          # Environment config
    ├── errors.ts          # Error classes
    ├── client.ts          # MCP client
    │
    ├── docs/              # Generated module
    │   ├── types.ts       # TypeScript interfaces
    │   ├── client.ts      # Typed methods
    │   └── index.ts       # Module exports
    │
    ├── enquiries/         # Another module
    │   ├── types.ts
    │   ├── client.ts
    │   └── index.ts
    │
    └── examples/          # Runnable scripts
        ├── create-doc.ts
        ├── list-spaces.ts
        └── create-enquiry.ts
```

## Environment Variables

The SDK uses these environment variables:

| Variable | Description | Default |
|----------|-------------|---------|
| `SDK_MODE` | Execution mode: 'local', 'remote', 'auto' | 'auto' |
| `SDK_BASE_URL` | Target Worker URL | http://localhost:8787 |
| `SDK_API_TOKEN` | Bearer token for auth | (none) |

## Execution

Run generated scripts with:
```bash
SDK_API_TOKEN="your-token" SDK_BASE_URL="https://app.workers.dev" npx tsx scripts/sdk/examples/create-doc.ts
```

## Naming Conventions

- **Module names**: Lowercase, from MCP server name (e.g., 'mcp-docs' → 'docs')
- **Method names**: camelCase from tool name (e.g., 'create_document' → 'createDocument')
- **Type names**: PascalCase (e.g., 'CreateDocumentInput', 'CreateDocumentOutput')

## Error Handling

The SDK provides typed errors:

- `AuthError` - 401, invalid token
- `ValidationError` - Invalid input
- `NotFoundError` - Resource not found
- `RateLimitError` - 429, too many requests
- `MCPError` - MCP protocol errors
- `NetworkError` - Connection failures

## Regeneration

When MCP tools change, regenerate the SDK:
1. Re-scan `src/server/modules/mcp*/server.ts`
2. Update types.ts with new/changed schemas
3. Update client.ts with new/changed methods
4. Preserve any custom code in examples/

Overview

This skill generates typed TypeScript SDKs so AI agents can call MCP servers with clean function calls instead of raw JSON-RPC curl commands. It auto-converts Zod input schemas to TypeScript interfaces, generates module clients, example scripts, and index exports to make MCP tools immediately programmable from agents and developer code.

How this skill works

The generator scans project MCP server modules for tool definitions, extracts each tool's name, description, Zod input schema, and endpoint, then converts schemas into TypeScript interfaces. It emits a client class per module with one strongly typed method per tool, an examples folder with runnable scripts, and central exports plus environment-aware client configuration and typed error classes.

When to use it

  • You need typed, programmatic access to MCP tools from agents or apps.
  • You want to replace JSON-RPC curl snippets with simple function calls.
  • Building reusable agent automation scripts for Claude Code or similar agents.
  • Keeping SDK types and clients in sync when MCP tool schemas change.
  • Bootstrapping developer onboarding for MCP-enabled full-stack projects.

Best practices

  • Keep MCP tool definitions in src/server/modules/mcp*/server.ts so the scanner finds them.
  • Use Zod schemas for inputs to guarantee correct TypeScript interface generation.
  • Store SDK templates in scripts/sdk/ and commit generated types and clients for CI stability.
  • Set SDK_BASE_URL and SDK_API_TOKEN in CI or local env when running examples.
  • Regenerate the SDK after changing any tool schema and review diffs for breaking type changes.

Example use cases

  • Generate a docs client and call docs.createDocument from an agent example script.
  • Create an enquiries module and run a runnable create-enquiry.ts script in CI to validate contract.
  • Integrate generated clients into a React/Cloudflare full-stack app for secure MCP calls.
  • Use generated types to enable IDE autocomplete and catch input mistakes at compile time.
  • Bundle SDK into automation tasks executed by Claude Code or other agent runtimes.

FAQ

How are Zod schemas converted to TypeScript?

Zod input schemas are parsed and translated into equivalent TypeScript interfaces placed in each module's types.ts.

Where do generated files go?

Files are written under scripts/sdk/, with module folders (types.ts, client.ts, index.ts), a top-level client/config, and examples.