К основному содержанию
скилл CX Codex

pinme-email — скилл для Claude Code: отправка писем в PinMe Worker

Помогает агенту писать код для отправки почты из PinMe Worker на TypeScript через send_email, чтобы не собирать запрос вручную.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add glitternetwork/pinme --skill pinme-email -a claude-code
Открыть на GitHub

Что делает pinme-email

Скилл подсказывает ИИ, как устроен POST {BASE_URL}/api/v4/send_email: заголовок X-API-Key, три поля в теле (to, subject, html) и адрес отправителя вида {project_name}@pinme.cloud. Внутри есть готовый пример функции на TypeScript и общий обработчик callPinmeAPI, который разбирает единый формат ответа платформы (code, msg, data).

Настраивать ничего не нужно: API_KEY и BASE_URL подставляются в Worker при создании. BASE_URL необязателен и по умолчанию равен https://pinme.cloud. Скилл разбирает коды ошибок: 401 при неверном или отсутствующем ключе, 400 при невалидном адресе или пустой теме, 500 при сбое почтового сервиса.

Скилл заточен под Worker на TypeScript и API v4 платформы. В другом окружении и на другом эндпоинте примеры не заработают: поля и заголовок аутентификации завязаны на PinMe.

Какие задачи решает

  • отправить письмо с кодом подтверждения из Worker
  • собрать HTML-письмо и отправить его получателю
  • обработать ошибки отправки почты в едином формате API
  • написать вызов send_email без опоры на документацию

Примеры запросов агенту

  • Добавь в backend/src/worker.ts отправку письма с кодом подтверждения через send_email
  • Сделай обработчик callPinmeAPI, который разбирает ответ PinMe и возвращает ошибку текстом
  • Проверь, что при 401 и 400 маршрут отдаёт понятную ошибку клиенту

Как установить pinme-email

1Через Skills CLI (Vercel)

npx skills add glitternetwork/pinme --skill pinme-email -a claude-code

2Вручную: положить файлы

~/.claude/skills/pinme-email/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/pinme-email/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о pinme-email

Как установить pinme-email в Claude Code?

Выполните npx skills add glitternetwork/pinme --skill pinme-email -a claude-code. Скилл окажется в ~/.claude/skills/pinme-email/SKILL.md.

Что делает pinme-email?

Подсказывает агенту, как вызвать send_email из PinMe Worker: заголовки, тело запроса, примеры на TypeScript и разбор ошибок.

Нужно ли вручную прописывать API-ключ?

Нет. API_KEY и BASE_URL автоматически попадают в окружение Worker при его создании.

Исходный текст

SKILL.md · MIT
---
name: pinme-email
description: Use this skill when a PinMe project (Worker TypeScript) needs to integrate email sending (send_email). Guides AI to generate correct Worker TS code.
---

# PinMe Worker Email API Integration

Guides how to call PinMe platform's email sending API in a PinMe Worker (TypeScript).

## Environment Variables

The following environment variables are automatically injected when the Worker is created — no manual configuration needed:

```typescript
// backend/src/worker.ts
export interface Env {
  DB: D1Database;
  API_KEY: string;      // Project API Key — used for send_email authentication
  BASE_URL?: string;    // Optional override for PinMe API base URL, defaults to https://pinme.cloud
}
```

> `API_KEY` is the sole credential for the Worker to call PinMe platform APIs. When `BASE_URL` is not set, it defaults to `https://pinme.cloud`.

---

## Send Email API

**Endpoint:** `POST {BASE_URL}/api/v4/send_email`
**Authentication:** `X-API-Key` header (using `env.API_KEY`)
**Sender:** Automatically set to `{project_name}@pinme.cloud`

### Request Format

```json
{
  "to": "[email protected]",
  "subject": "Your verification code",
  "html": "<p>Your code is <strong>123456</strong></p>"
}
```

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `to` | string | Yes | Recipient email address |
| `subject` | string | Yes | Email subject |
| `html` | string | Yes | HTML body |

### Response Format

**Success (200):**
```json
{ "code": 200, "msg": "ok", "data": { "ok": true } }
```

**Errors:**

| HTTP Status | Meaning | data.error Example |
|-------------|---------|-------------------|
| 401 | API Key missing or invalid | `"X-API-Key header is required"` / `"Invalid API key"` |
| 400 | Parameter validation failed | `"Invalid email address"` / `"Subject is required"` |
| 500 | Email service error | `"Failed to send email"` |

### Worker Example Code

```typescript
async function sendEmail(env: Env, to: string, subject: string, html: string): Promise<{ ok: boolean; error?: string }> {
  const baseUrl = env.BASE_URL ?? 'https://pinme.cloud';
  const resp = await fetch(`${baseUrl}/api/v4/send_email`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': env.API_KEY,
    },
    body: JSON.stringify({ to, subject, html }),
  });

  const result = await resp.json() as { code: number; msg: string; data?: { ok?: boolean; error?: string } };

  if (resp.status !== 200 || result.code !== 200) {
    return { ok: false, error: result.data?.error || result.msg || 'Unknown error' };
  }
  return { ok: true };
}

// Usage in routes
async function handleSendVerification(request: Request, env: Env): Promise<Response> {
  const { email } = await request.json() as { email: string };
  const code = Math.random().toString().slice(2, 8);

  const result = await sendEmail(env, email, 'Verification Code',
    `<p>Your code is <strong>${code}</strong></p>`);

  if (!result.ok) {
    return json({ error: result.error }, 500);
  }
  return json({ ok: true });
}
```

---

## Error Handling Pattern

PinMe platform API unified response format:

```typescript
interface PinmeResponse<T = unknown> {
  code: number;   // 200=success, other=failure
  msg: string;    // "ok" | "error" | "invalid params"
  data?: T;       // Business data on success, may contain { error: string } on failure
}
```

### Recommended Unified Error Handler

```typescript
async function callPinmeAPI<T>(url: string, apiKey: string, body: unknown): Promise<{ data?: T; error?: string }> {
  let resp: Response;
  try {
    resp = await fetch(url, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json', 'X-API-Key': apiKey },
      body: JSON.stringify(body),
    });
  } catch {
    return { error: 'Network error' };
  }

  if (!resp.ok) {
    try {
      const err = await resp.json() as PinmeResponse;
      return { error: err.data && typeof err.data === 'object' && 'error' in err.data
        ? (err.data as { error: string }).error
        : err.msg || `HTTP ${resp.status}` };
    } catch {
      return { error: `HTTP ${resp.status}` };
    }
  }

  const result = await resp.json() as PinmeResponse<T>;
  if (result.code !== 200) {
    return { error: result.data && typeof result.data === 'object' && 'error' in result.data
      ? (result.data as { error: string }).error
      : result.msg };
  }
  return { data: result.data as T };
}
```

### Usage Example

```typescript
const baseUrl = env.BASE_URL ?? 'https://pinme.cloud';

// Send email
const emailResult = await callPinmeAPI<{ ok: boolean }>(
  `${baseUrl}/api/v4/send_email`, env.API_KEY,
  { to: '[email protected]', subject: 'Hello', html: '<p>Hi</p>' },
);
if (emailResult.error) return json({ error: emailResult.error }, 500);
```

© glitternetwork · MIT · glitternetwork/pinme

Похожие скиллы

Всё по теме «Бэкенд и API» →
mcp-builder официальный anthropics Скилл проводит через создание MCP-сервера на TypeScript или Python: от изучения протокола до тестов и оценки качества. 130 949установок claude-api официальный anthropics Справочник по Anthropic SDK и API Claude для генерации кода без устаревших параметров и выдуманных методов. 74 198установок lark-im larksuite Скилл подключает Lark IM к агенту: он отправляет сообщения, ищет историю, управляет чатами и файлами. Подойдёт для задач вокруг командных коммуникаций. CX Codex +1 472 900установок lark-event larksuite Слушает события Lark/Feishu и отдаёт их потоком NDJSON. Подходит для ботов, обработчиков сообщений и долгих подписчиков. CX Codex +1 466 800установок caveman-discover JuliusBrussee Находит точки вызова LLM в репозитории и размечает их воркфлоу для Caveman Cloud, чтобы расходы на токены не сливались в одну общую кучу. CX Codex +1 104 400установок migration JuliusBrussee Скилл задаёт правила безопасных миграций схем, данных и API с обязательным откатом. Пригодится при изменениях, где нельзя терять данные или ломать совместимость. CX Codex +1 103 900установок

Из того же набора5

Спонсоры проекта

Компании, которые помогают держать аналитику открытой