Agent skill

LangBot Plugin Development

by langbot-app in langbot-app/LangBot

Guides building, debugging and testing LangBot plugins: components, SDK calls, README and locale rules, SDK pitfalls and WebSocket-based testing.

Apache-2.0Auto-check passedDevelopment

Install LangBot Plugin Development

skills CLI
$ npx skills add langbot-app/LangBot --skill langbot-plugin-dev -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install langbot-app/LangBot langbot-plugin-dev --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/langbot-app/LangBot.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/skills/langbot-plugin-dev .claude/skills/langbot-plugin-dev && rm -rf skills-src

Use ~/.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/

Facts

Skill name
langbot-plugin-dev
GitHub stars
18k
Token cost
~3.9k tokens
SKILL.md length
975 words
Files
2 (incl. references)
Skills in repo
9
Repo updated
First seen
Licence
Apache-2.0

At a glance

Guides building, debugging and testing LangBot plugins: components, SDK calls, README and locale rules, SDK pitfalls and WebSocket-based testing.

  • Works in 10 steps: MessageChain is a RootModel — iterate… → Message.content must be… → invoke_llm does NOT accept timeout → …
  • Creating a new LangBot plugin with listeners, commands or tools
  • SKILL.md covers Controlling a running instance…, Plugin Architecture, README & i18n convention… and Critical SDK Pitfalls, plus 8 more sections
  • Calls curl and docker; reaches space.langbot.app

What it does

The skill covers writing LangBot plugins, which are folders with a manifest.yaml, a main.py entry point subclassing BasePlugin, and components that each pair a .yaml file with a .py implementation. The component types named are EventListener, Command and Tool, and the SDK calls it covers include invoke_llm, get_llm_models, send_message and plugin storage.

It also describes driving a running LangBot instance over MCP through two servers, one on the instance and one for the LangBot Space marketplace, using API keys or a personal access token. Marketplace rules are spelled out: the root README.md must be in English, other languages go under a readme folder, and the manifest label and description carry the same set of 8 locales.

A section of critical SDK pitfalls shows wrong and right code, for example iterating a MessageChain directly because it has no components attribute. A reference file covers setting up a test environment, and the skill supports automated testing over WebSocket.

When your agent uses it

  • Creating a new LangBot plugin with listeners, commands or tools
  • Fixing a bug in an existing LangBot plugin
  • Setting up a LangBot test environment and testing a plugin over WebSocket
  • Preparing a plugin's README and manifest for the marketplace

Example prompts

  • “Create a LangBot plugin with a command that summarizes the last hour of group chat.”
  • “My plugin crashes when it reads event.message_chain. Find the bug and fix it.”
  • “Set up a local LangBot test environment so I can test the plugin over WebSocket.”
  • “Add translated READMEs and manifest labels so the plugin is ready for the marketplace.”

Requirements

  • A LangBot instance for testing
  • Python, for the plugin code

Workflow steps

10 steps, taken from the step headings in SKILL.md.

  1. MessageChain is a RootModel — iterate directly
  2. Message.content must be list[ContentElement] or str, not a single ContentElement
  3. invoke_llm does NOT accept timeout
  4. invoke_llm response.content can be str OR list
  5. get_llm_models() returns UUIDs
  6. invoke_llm parameter is llm_model_uuid, NOT model_uuid
  7. prevent_default() alone does NOT block LLM response
  8. get_plugin_storage / set_plugin_storage may throw KeyError: 'owner'
  9. Component YAML must have full structure, not just name/description
  10. BasePlugin import path

What it can do on your machine

Read from SKILL.md and the folder at commit de886ed. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • curl
    • docker

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • space.langbot.app

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

LangBot Plugin Development loads about 3.9k tokens when it runs, and up to ~4.6k if it reads all its reference files. Until then it costs about 121 tokens; SKILL.md has 975 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~121
When it runs · the whole SKILL.md, loaded when a task matches
~3.9k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~4.6k

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.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated 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.

SKILL.md

The full file from langbot-app/LangBot at commit de886ed, republished under its Apache-2.0 licence (© langbot-app). 975 words, ~3,876 tokens.

Download SKILL.mdSave it as .claude/skills/langbot-plugin-dev/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
langbot-plugin-dev
description
Develop, debug, and test LangBot plugins. Use when creating new LangBot plugins, fixing plugin bugs, setting up a LangBot test environment, or testing plugins via WebSocket. Covers plugin component architecture (EventListener, Command, Tool), the plugin SDK API (invoke_llm, get_llm_models, send_message, plugin storage), common pitfalls, and automated WebSocket-based testing. Triggers on "langbot plugin", "lbp", "GroupChatSummary", "plugin debug", "langbot test".

LangBot Plugin Development & Debugging

Controlling a running instance via MCP

Beyond writing code, you can drive a live LangBot instance over MCP — no raw HTTP needed. Two MCP servers exist (both reuse existing API keys; see AGENTS.md):

  • LangBot instance — http://<host>:5300/mcp (auth: web-UI lbk_ key or the api.global_api_key from config.yaml). Manage bots, pipelines, models, knowledge bases, and skills. See the langbot-mcp-ops skill.
  • LangBot Space marketplace — https://space.langbot.app/mcp (auth: Personal Access Token). Search plugins / MCP servers / skills. See the langbot-space-ops skill.

Any change to an agent-accessible HTTP API endpoint must keep the matching MCP tool and these skills in sync.

Plugin Architecture

A LangBot plugin consists of:

MyPlugin/
├── manifest.yaml          # Plugin metadata, config schema
├── main.py                # BasePlugin subclass (entry point, shared state)
├── components/
│   ├── event_listener/    # Hook pipeline events
│   │   ├── collector.yaml
│   │   └── collector.py
│   ├── commands/          # !command handlers
│   │   ├── mycommand.yaml
│   │   └── mycommand.py
│   └── tools/             # LLM function-call tools
│       ├── mytool.yaml
│       └── mytool.py

Each component has a .yaml (metadata) and .py (implementation).

README & i18n convention (enforced on the marketplace)

A plugin published to LangBot Space serves a localized README on its detail page. The resolver (langbot-space PluginService.GetPluginREADME) works like this:

  • Root README.md MUST be in English. It is the default and the fallback — when no per-language README matches the viewer's locale, the page serves the root README.md. A non-English root README makes the English/default view show the wrong language.
  • All other languages live under readme/README_{lang}.md — e.g. readme/README_zh_Hans.md, readme/README_ja_JP.md. The 8 supported locales: en_US, zh_Hans, zh_Hant, ja_JP, th_TH, vi_VN, es_ES, ru_RU.
  • manifest.yaml metadata.label / metadata.description should carry the same 8-locale i18n set (repository must be a real, alive URL).
MyPlugin/
├── manifest.yaml
├── README.md                   # English (default + fallback) — REQUIRED, must be English
└── readme/
    ├── README_zh_Hans.md
    ├── README_zh_Hant.md
    ├── README_ja_JP.md
    ├── README_th_TH.md
    ├── README_vi_VN.md
    ├── README_es_ES.md
    └── README_ru_RU.md

manifest.yaml (incl. repository) is the source of truth — the marketplace syncs from it, so edit the package and re-publish rather than patching live data.

Critical SDK Pitfalls

1. MessageChain is a RootModel — iterate directly
python
# ❌ WRONG — MessageChain has no .components attribute
for component in event.message_chain.components:

# ✅ CORRECT — MessageChain is a Pydantic RootModel, iterate directly
for component in event.message_chain:
2. Message.content must be list[ContentElement] or str, not a single ContentElement
python
from langbot_plugin.api.entities.builtin.provider import message as provider_message

# ❌ WRONG — single ContentElement
Message(role="user", content=ContentElement.from_text("hello"))

# ✅ CORRECT — list of ContentElement
Message(role="user", content=[ContentElement.from_text("hello")])

# ✅ ALSO CORRECT — plain string
Message(role="user", content="hello")
3. invoke_llm does NOT accept timeout
python
# ❌ WRONG
await self.invoke_llm(llm_model_uuid=uuid, messages=msgs, timeout=60)

# ✅ CORRECT
await self.invoke_llm(llm_model_uuid=uuid, messages=msgs)
4. invoke_llm response.content can be str OR list
python
response = await self.invoke_llm(...)
if response.content:
    if isinstance(response.content, str):
        return response.content
    elif isinstance(response.content, list):
        parts = [e.text for e in response.content if hasattr(e, "text") and e.text]
        return "\n".join(parts)
5. get_llm_models() returns UUIDs
python
# Returns list[str] of model UUIDs
models = await self.get_llm_models()
model_uuid = models[0]  # First available model UUID

Known bug (v4.9.3): The host handler may return list[dict] instead of list[str]. If you hit TypeError: unhashable type: 'dict' in invoke_llm, the fix is in LangBot/src/langbot/pkg/plugin/handler.py — change 'llm_models': llm_models to 'llm_models': [m['uuid'] for m in llm_models].

6. invoke_llm parameter is llm_model_uuid, NOT model_uuid
python
# ❌ WRONG — will throw "got an unexpected keyword argument"
await self.invoke_llm(messages=msgs, model_uuid=uuid)

# ✅ CORRECT
await self.invoke_llm(messages=msgs, llm_model_uuid=uuid)
7. prevent_default() alone does NOT block LLM response

To fully prevent the default LLM pipeline from responding when your EventListener handles the message, you must call both:

python
event_context.prevent_default()    # Block default behavior
event_context.prevent_postorder()  # Block subsequent plugins/pipeline

Using only prevent_default() still allows the LLM to generate a response.

8. get_plugin_storage / set_plugin_storage may throw KeyError: 'owner'

This is a version mismatch between the SDK and host. Wrap storage calls in try/except:

python
try:
    data = await self.get_plugin_storage("my_key")
except Exception:
    data = None  # Fallback gracefully
9. Component YAML must have full structure, not just name/description
yaml
# ❌ WRONG — will silently fail to register the component
name: translator
description:
  en_US: 'Does stuff'

# ✅ CORRECT — full component YAML
apiVersion: v1
kind: EventListener
metadata:
  name: translator
  label:
    en_US: Translator
spec:
execution:
  python:
    path: translator.py
    attr: Translator
10. BasePlugin import path
python
# ❌ WRONG
from langbot_plugin.api.definition.base_plugin import BasePlugin

# ✅ CORRECT
from langbot_plugin.api.definition.plugin import BasePlugin

Pipeline Events

Events the EventListener can hook (from most general to most specific):

EventWhen
GroupMessageReceivedAny group message arrives (before trigger rules)
PersonMessageReceivedAny private message arrives
GroupNormalMessageReceivedGroup message passes trigger rules, going to LLM
PersonNormalMessageReceivedPrivate message going to LLM
GroupCommandSentGroup message matched as command
PersonCommandSentPrivate message matched as command
NormalMessageRespondedLLM generated a response
PromptPreProcessingAbout to build LLM context

Key insight: *MessageReceived fires for ALL messages regardless of trigger rules. *NormalMessageReceived only fires for messages that match the pipeline's trigger rules (e.g., @bot, prefix, random%). Use *MessageReceived for message collection/logging.

EventContext API

python
@self.handler(events.GroupMessageReceived)
async def on_msg(event_context: context.EventContext):
    event = event_context.event
    event.launcher_id    # Group ID
    event.sender_id      # Sender ID
    event.message_chain  # MessageChain (iterate directly)

    # Reply to the current conversation
    await event_context.reply(MessageChain([Plain(text="hello")]))

    # Block default pipeline behavior
    event_context.prevent_default()

    # Block subsequent plugins
    event_context.prevent_postorder()

Setting Up a Test Environment

Deploy via Docker (GitOps + Portainer)

See references/test-env-setup.md for full deployment steps.

Quick summary:

  1. Create docker-compose.yaml in server-deploy repo
  2. Deploy via Portainer git repository method
  3. Set up admin account via /api/v1/user/init POST
  4. Configure LLM provider and model via API
  5. Copy plugin to data/plugins/ directory
WebSocket Testing

LangBot's WebUI chat uses WebSocket. Connect to test message flow:

ws://<host>:<port>/api/v1/pipelines/<pipeline_uuid>/ws/connect?session_type=group
  • session_type=group for group chat simulation
  • session_type=person for private chat (always triggers pipeline)

Requires Origin header to pass CORS:

javascript
const ws = new WebSocket(url, {
  headers: { Origin: 'https://your-langbot-domain' }
});

Send messages:

json
{"type": "message", "message": [{"type": "Plain", "text": "hello"}]}

Receive:

  • {"type": "connected", ...} — connection established
  • {"type": "user_message", "data": {...}} — echo of sent message
  • {"type": "response", "data": {"content": "...", "is_final": true/false}} — bot reply (streamed)
Show full SKILL.md (372 more words)Show less
Group Trigger Rules

Group messages only enter the pipeline if trigger rules are met:

json
{
  "group-respond-rules": {
    "at": true,          // Respond when @bot
    "prefix": ["ai"],    // Respond to messages starting with "ai"
    "random": 0.0,       // Probability of responding to any message (0.0-1.0)
    "regexp": []         // Regex patterns
  }
}

For testing, set random: 1.0 via PUT /api/v1/pipelines/<uuid> to respond to all messages.

Important: EventListener hooks like GroupMessageReceived fire regardless of trigger rules. Only the LLM processing (GroupNormalMessageReceived and beyond) requires trigger rules.

Plugin Hot-Reload

There is no hot-reload. After changing plugin files:

bash
docker restart <runtime-container>
# Wait ~5 seconds for plugin to re-mount

The main LangBot container does NOT need restart for plugin changes — only the runtime container.

API Quick Reference

Admin Setup
bash
# Initialize admin account (first time only)
curl -X POST $BASE/api/v1/user/init \
  -H "Content-Type: application/json" \
  -d '{"user":"admin@test.com","password":"test123"}'

# Login
curl -X POST $BASE/api/v1/user/auth \
  -H "Content-Type: application/json" \
  -d '{"user":"admin@test.com","password":"test123"}'
# Returns: {"data":{"token":"eyJ..."}}
Provider & Model Setup
bash
# Create provider
curl -X POST $BASE/api/v1/provider/providers \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"MyProvider","requester":"new-api-chat-completions","base_url":"https://api.example.com/v1","api_keys":["sk-xxx"]}'

# Create LLM model
curl -X POST $BASE/api/v1/provider/models/llm \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"gpt-4o-mini","provider_uuid":"<uuid>","abilities":["chat","tool-use"]}'

# List models
curl $BASE/api/v1/provider/models/llm -H "Authorization: Bearer $TOKEN"
Pipeline Config
bash
# Get pipeline
curl $BASE/api/v1/pipelines -H "Authorization: Bearer $TOKEN"

# Update pipeline (e.g., set model, modify trigger rules)
curl -X PUT $BASE/api/v1/pipelines/<uuid> \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '<full pipeline JSON>'

Plugin Config Types

Supported type values in manifest.yaml spec.config:

TypeDescriptionValue
stringText inputstring
int / integerNumber inputint
floatDecimal inputfloat
bool / booleanTogglebool
selectDropdown (needs options)string
prompt-editorMulti-line prompt editorstring
llm-model-selectorLLM model picker UIUUID string
bot-selectorBot picker UIUUID string

Example — let users choose which model the plugin uses:

yaml
spec:
  config:
    - name: model
      type: llm-model-selector
      label:
        en_US: 'LLM Model'
        zh_Hans: 'LLM 模型'
      description:
        en_US: 'Select the LLM model. Falls back to first available if not set.'
        zh_Hans: '选择 LLM 模型。未设置时使用第一个可用模型。'
      required: false

Read config in plugin code:

python
model_uuid = self.get_config().get("model")

Container Restart Timing

After plugin file changes, only the runtime container needs restart:

bash
docker restart langbot-test-runtime
# Wait ~15 seconds before testing

When to restart both (runtime first, then host):

  • Added/removed Command or Tool components (host caches component lists)
  • Changed manifest.yaml structure
bash
docker restart langbot-test-runtime
sleep 8
docker restart langbot-test
sleep 8

⚠️ Do NOT restart both simultaneously — the host may connect before plugins are mounted, causing 502 errors or missing plugin registrations.

Debugging Checklist

When a plugin doesn't work:

  1. Check runtime logs: docker logs <runtime-container> — look for mount/init errors
  2. Check host logs: docker logs <langbot-container> — look for pipeline processing errors
  3. Verify plugin loaded: GET /api/v1/plugins — should list your plugin
  4. Test person mode first: session_type=person always triggers pipeline, isolating trigger rule issues
  5. Check trigger rules: Group mode requires @bot, prefix match, or random% to enter pipeline
  6. Verify model configured: Pipeline's config.ai.runner_config[config.ai.runner.id].model.primary must point to a valid model UUID with working API keys

Publishing Plugins

After testing, publish via lbp publish:

bash
cd /path/to/MyPlugin
lbp publish

This builds .lbpkg and uploads to Space marketplace as a draft. Then go to https://space.langbot.app/market to upload screenshots and submit for review.

Prerequisite: Must be logged in via lbp login --token lbpat_xxx (PAT from Space profile page).

Reference: EventListener-Only Plugin Pattern

For plugins that react to messages without commands or tools (e.g., auto-summarize URLs, collect messages, translate):

MyPlugin/
├── manifest.yaml       # Only EventListener in spec.components
├── main.py             # BasePlugin with shared logic (fetch, LLM calls)
├── components/
│   └── event_listener/
│       ├── detector.yaml
│       └── detector.py
└── requirements.txt

manifest.yaml — only declare EventListener:

yaml
spec:
  components:
    EventListener:
      fromDirs:
      - path: components/event_listener/

detector.py — hook *MessageReceived, extract text, process, reply:

python
@self.handler(events.PersonMessageReceived)
async def on_msg(event_context: context.EventContext):
    event = event_context.event
    text_parts = []
    for component in event.message_chain:
        if isinstance(component, platform_message.Plain):
            text_parts.append(component.text)
    text = "".join(text_parts).strip()
    
    if should_handle(text):
        event_context.prevent_default()
        event_context.prevent_postorder()
        result = await self.plugin.process(text)
        await event_context.reply(platform_message.MessageChain([
            platform_message.Plain(text=result)
        ]))

Key: Access shared plugin logic via self.plugin (the BasePlugin instance).

© langbot-app, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file (references) in skills/skills/langbot-plugin-dev of langbot-app/LangBot.

  • SKILL.md
  • references/test-env-setup.md

Open the folder on GitHubat commit de886ed

Compare with similar skills

LangBot Plugin Development 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.

LangBot Plugin Development compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
LangBot Plugin Development this skilllangbot-app/LangBot18k—~3.9kAutomated safety check: PassApache-2.0
MCP Debuggerdebugmcp/mcp-debugger171—~3.8kAutomated safety check: PassMIT
Ue Live DebuggingJasonMa0012/MooaToon749—~2.9kAutomated safety check: NotesCustom licence
SlintMoosync/Moosync259—~2.4kAutomated safety check: PassGPL-3.0
MCP DeveloperJeffallan/claude-skills12k—~1.5kAutomated safety check: PassMIT
Aris InfraOpenLAIR/dr-claw1.2k—~1.4kAutomated safety check: NotesMIT

Similar skills

  • MCP Debugger

    debugmcp/mcp-debugger

    A skill your agent uses when investigating a bug, failing test, or unexpected runtime behavior and the mcp-debugger MCP server is available — drives real step-through debuggers (breakpoints, stack…

    171 GitHub stars~3.8k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Ue Live Debugging

    JasonMa0012/MooaToon

    A skill your agent uses when debugging UE C++ crashes, runtime bugs, or unexpected behavior with Rider MCP available.

    749 GitHub stars~2.9k tokensUpdated 19 days ago
    DevelopmentAuto-check: notes
  • Slint

    Moosync/Moosync

    Expert guidance for building, debugging, and working with Slint GUI applications.

    259 GitHub stars~2.4k tokensUpdated 5 days ago
    DevelopmentAuto-check passed
  • MCP Developer

    Jeffallan/claude-skills

    Builds and debugs MCP servers and clients in TypeScript or Python, from tool and resource definitions to transport setup and inspector-based protocol checks.

    12k GitHub stars~1.5k tokensUpdated 4 days ago
    Agent WorkflowsAuto-check passed
  • Aris Infra

    OpenLAIR/dr-claw

    ARIS (Auto-claude-code-research-in-sleep) infrastructure setup and configuration.

    1.2k GitHub stars~1.4k tokensUpdated 19 days ago
    Agent WorkflowsAuto-check: notes
  • Nx Monorepo

    aiskillstore/marketplace

    Nx monorepo management skill for AI-native development. An agent skill from aiskillstore/marketplace.

    430 GitHub stars~2k tokensUpdated today
    DevelopmentAuto-check passed

More from langbot-app/LangBot

All 9 skills in this repo
  • LangBot Deployment Guide

    langbot-app/LangBot

    Deploys and configures a LangBot instance with Docker Compose or Kubernetes, covering config.yaml, the Box sandbox runtime, the plugin runtime and the global API key.

    18k GitHub stars~1.2k tokensUpdated today
    Auto-check: notes
  • LangBot Core Development

    langbot-app/LangBot

    Covers developing the LangBot core backend and web UI: dev setup, repo layout, API auth types, adding endpoints, migrations and keeping the MCP server in step.

    18k GitHub stars~1.4k tokensUpdated today
    Auto-check: notes
  • Guides building, migrating and testing LangBot messaging-platform adapters for the Event-Based Agents layout, with unified event and message conversion.

    18k GitHub stars~4k tokensUpdated today
    Auto-check passed
  • LangBot MCP Operations

    langbot-app/LangBot

    Manages a LangBot instance over its built-in MCP server: endpoint, API-key authentication, client config and the tool set for bots, processors and more.

    18k GitHub stars~2.4k tokensUpdated today
    Auto-check passed
  • LangBot Space MCP

    langbot-app/LangBot

    Browses and searches the LangBot Space marketplaces for plugins, MCP servers and skills through its read-only MCP server, authenticated with a personal access token.

    18k GitHub stars~1.3k tokensUpdated today
    Auto-check passed
  • LangBot Environment Setup

    langbot-app/LangBot

    Prepares a LangBot development and testing environment for an agent, covering service startup, proxy settings and browser access through Computer Use or Playwright MCP.

    18k GitHub stars~496 tokensUpdated today
    Auto-check: notes

Questions about LangBot Plugin Development

What does LangBot Plugin Development do?

Guides building, debugging and testing LangBot plugins: components, SDK calls, README and locale rules, SDK pitfalls and WebSocket-based testing. py implementation. The component types named are EventListener, Command and Tool, and the SDK calls it covers include invoke_llm, get_llm_models, send_message and plugin storage.

When should I use LangBot Plugin Development?

LangBot Plugin Development fits situations like: creating a new LangBot plugin with listeners, commands or tools; fixing a bug in an existing LangBot plugin; setting up a LangBot test environment and testing a plugin over WebSocket; preparing a plugin's README and manifest for the marketplace.

How do I install LangBot Plugin Development in Claude Code?

Run `npx skills add langbot-app/LangBot --skill langbot-plugin-dev -a claude-code`. Or copy the skill folder (skills/skills/langbot-plugin-dev in langbot-app/LangBot) into .claude/skills/langbot-plugin-dev in your project. Claude Code loads it when a task matches its description.

How do I install LangBot Plugin Development in Codex?

Run `npx skills add langbot-app/LangBot --skill langbot-plugin-dev -a codex`. Or copy the skill folder (skills/skills/langbot-plugin-dev in langbot-app/LangBot) into .agents/skills/langbot-plugin-dev in your project. Codex loads it when a task matches its description.

Can I use LangBot Plugin Development in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add langbot-app/LangBot --skill langbot-plugin-dev -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/langbot-plugin-dev, .gemini/skills/langbot-plugin-dev, .github/skills/langbot-plugin-dev and .opencode/skills/langbot-plugin-dev in your project.

What does LangBot Plugin Development need to run?

Going by SKILL.md and its folder, LangBot Plugin Development needs the command-line tools its instructions call (curl and docker). Our summary lists: A LangBot instance for testing; Python, for the plugin code.

Does LangBot Plugin Development access the network?

SKILL.md names 1 domain. In commands or code: space.langbot.app; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is LangBot Plugin Development safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does LangBot Plugin Development use?

LangBot Plugin Development is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does LangBot Plugin Development use?

About 3.9k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 736 tokens, read only when the agent opens those files.

What are the alternatives to LangBot Plugin Development?

Skills that share tags, products or a category with LangBot Plugin Development: MCP Debugger (debugmcp/mcp-debugger, 171 stars), Ue Live Debugging (JasonMa0012/MooaToon, 749 stars), Slint (Moosync/Moosync, 259 stars) and MCP Developer (Jeffallan/claude-skills, 12k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains LangBot Plugin Development?

langbot-app (a GitHub organization) maintains it in langbot-app/LangBot, which has 18,033 GitHub stars. The repository holds 9 skills in this directory. The repository was last updated on October 7, 2026.

Source: langbot-app/LangBot on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.