About
The Skedyul SDK for Node.js
README
The official Node.js SDK for building Skedyul integration apps. Publish tools, webhooks, CRM models, agents, skills, and workflows — then run them on serverless (Lambda) or dedicated (Docker/ECS) compute.
Package: skedyul · Version: 1.4.x · Node: 22+
What you can build
| Capability | Description |
|---|---|
| MCP tools | Functions AI agents invoke via the Model Context Protocol |
| Webhooks | HTTP handlers for SMS, email, OAuth callbacks, and third-party events |
| Lifecycle hooks | Install, provision, uninstall, and OAuth flows |
| CRM models | App-owned (internal) and user-mapped (shared) data models |
| Agents (v3) | Skills-based autonomous agents deployed per workplace |
| Skills & workflows | YAML-defined capabilities and event-driven automation |
| Core API client | Typed client for workplaces, channels, instances, files, cron, AI, calls, and more |
| CLI | Local dev server, tunneling, deploy, CRM schema sync, agent testing |
Installation
npm install skedyul
# or
pnpm add skedyul
The CLI is included:
skedyul --help
Quick start
1. Create skedyul.config.ts
import { defineConfig } from 'skedyul'
import pkg from './package.json'
export default defineConfig({
name: 'My Integration',
version: pkg.version,
description: 'What this app does',
computeLayer: 'serverless',
tools: import('./src/registries'),
webhooks: import('./src/registries'),
provision: import('./provision'),
})
2. Aggregate provision config
// provision.ts
import type { ProvisionConfig } from 'skedyul'
import env from './env'
import { models, relationships } from './crm'
import * as channels from './channels'
import * as pages from './pages'
import navigation from './pages/navigation'
export default {
env,
navigation,
models: Object.values(models),
channels: Object.values(channels),
pages: Object.values(pages),
relationships,
} satisfies ProvisionConfig
3. Define a tool
import { z, type ToolHandler, type ToolDefinition } from 'skedyul'
const inputSchema = z.object({
name: z.string().optional(),
})
type Input = z.infer<typeof inputSchema>
type Output = { message: string }
const handler: ToolHandler<Input, Output> = async (input) => ({
output: { message: `Hello, ${input.name ?? 'world'}!` },
billing: { credits: 1 },
meta: { success: true, message: 'Greeting sent', toolName: 'hello' },
})
export const helloTool: ToolDefinition<Input, Output> = {
name: 'hello',
description: 'Say hello to someone',
inputSchema,
handler,
}
4. Build and run locally
skedyul auth login
skedyul dev link --workplace my-clinic
skedyul build
skedyul dev serve --workplace my-clinic
See Local development for the full workflow.
Package exports
| Import path | Use case |
|---|---|
skedyul |
Main SDK — config, tools, webhooks, Core API, schemas |
skedyul/serverless |
AWS Lambda handler entry |
skedyul/dedicated |
Long-running HTTP server entry |
skedyul/schemas/agent-schema-v3 |
Agent YAML v3 types and validation |
skedyul/schemas/agent-schema |
Legacy multi-stage agent schema |
skedyul/skills/types |
Skill YAML types |
skedyul/scheduling |
Workflow-safe time windows and wait calculations |
skedyul/cli/utils/auth |
CLI auth helpers (for monorepo tooling) |
Server modes
Serverless (Lambda)
import { server } from 'skedyul'
import config from './skedyul.config'
const mcpServer = server.create({
...config,
computeLayer: 'serverless',
tools: toolRegistry,
webhooks: webhookRegistry,
})
export const handler = mcpServer.handler
Or use the dedicated subpath export:
import { handler } from 'skedyul/serverless'
Dedicated (Docker / ECS)
const mcpServer = server.create({
...config,
computeLayer: 'dedicated',
defaultPort: 3000,
tools: toolRegistry,
webhooks: webhookRegistry,
})
await mcpServer.listen()
See Server runtime for endpoints, hooks, and compute-layer differences.
Documentation
Full documentation lives in docs/.
Getting started
| Guide | Description |
|---|---|
| Configuration | skedyul.config.ts reference — models, channels, pages, env, queues |
| Tools | Building MCP tools with Zod schemas and handlers |
| Webhooks | Receiving external events and lifecycle hooks on channels |
| Lifecycle hooks | Install, provision, uninstall, OAuth |
| Authentication | Token types, scopes, and SDK configuration |
| Core API | Platform resource client reference |
| Errors | Install and runtime error types |
Platform features
| Guide | Description |
|---|---|
| Agents, skills & workflows | Agent YAML v3, skills, workflow YAML, compiler, context |
| CRM schema | Workplace-level schema migrations (defineSchema) |
| Rate-limit queues | queuedFetch for external API throttling |
| Server runtime | HTTP endpoints, dedicated vs serverless, MCP protocol |
| CLI reference | All skedyul commands and flags |
Project structure
Recommended layout for a modular integration app:
my-app/
├── skedyul.config.ts # App metadata, registries, build, queues
├── provision.ts # Aggregates version-level config
├── install.ts # Optional per-installation config (shared models)
├── env.ts # Environment variable definitions
├── crm/
│ ├── index.ts
│ ├── relationships.ts
│ └── models/
├── channels/
├── pages/
├── agents/ # Agent YAML v3 files (deployed via CLI)
├── skills/ # Skill YAML files
├── workflows/ # Workflow YAML v2 files
└── src/
├── registries.ts # Tool and webhook registries
└── server.ts # Optional custom server entry
CLI overview
# Authentication
skedyul auth login
skedyul auth use <profile>
# Local development (linked mode)
skedyul dev link --workplace <subdomain>
skedyul dev install --workplace <subdomain>
skedyul build
skedyul dev serve --workplace <subdomain>
# Deploy
skedyul dev diff --workplace <subdomain>
skedyul dev deploy --workplace <subdomain>
# Agents, skills, workflows
skedyul agents deploy --file ./agents/booking.yaml --workplace <subdomain>
skedyul skills deploy --file ./skills/scheduling.yaml --workplace <subdomain>
skedyul workflows deploy --file ./workflows/reminder.yaml --workplace <subdomain>
# Testing
skedyul chat --agent booking --workplace <subdomain>
skedyul dev invoke my_tool --workplace <subdomain>
See CLI reference for every command, flag, and config file path.
Configuration files
| File | Purpose |
|---|---|
~/.skedyul/profiles.json |
Auth profiles (multi-server support) |
~/.skedyul/config.json |
Global CLI config (defaultServer, ngrokAuthtoken) |
.skedyul.local.json |
Project-level server URL override |
.skedyul/links/<workplace>.json |
Per-workplace link config |
.skedyul/env/<workplace>.env |
Per-workplace environment variables |
Development (this package)
pnpm install
pnpm build # Compile TypeScript + bundle with tsup
pnpm test # Node test runner
Contributing
- Use strict TypeScript — no
any - Keep MCP transports lean; shared logic belongs in
src/server/route-handlers - Add unit tests under
tests/for new behavior - Update docs in
docs/when adding public APIs or CLI commands
Open a PR with a clear summary for review.
License
MIT
Install Skedyul in Claude Desktop, Claude Code & Cursor
unyly install skedyulInstalls into Claude Desktop, Claude Code, Cursor & VS Code — handles npx, uvx and build-from-source repos for you.
First time? Get the CLI: curl -fsSL https://unyly.org/install | sh
Or configure manually
Run in your terminal:
claude mcp add skedyul -- npx -y skedyulFAQ
Is Skedyul MCP free?
Yes, Skedyul MCP is free — one-click install via Unyly at no cost.
Does Skedyul need an API key?
No, Skedyul runs without API keys or environment variables.
Is Skedyul hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Skedyul in Claude Desktop, Claude Code or Cursor?
Open Skedyul on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
GitHub
PRs, issues, code search, CI status
by GitHubFilesystem
Secure file operations with configurable access controls.
Memory
Knowledge graph-based persistent memory system.
Template MCP Server
A CLI tool to create a new Model Context Protocol server project with TypeScript support, dual transport options, and an extensible structure
by mcpdotdirectCompare Skedyul with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All development MCPs
