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…
Guides building, debugging and testing LangBot plugins: components, SDK calls, README and locale rules, SDK pitfalls and WebSocket-based testing.
$ npx skills add langbot-app/LangBot --skill langbot-plugin-dev -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install langbot-app/LangBot langbot-plugin-dev --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ 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-srcUse ~/.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/
Install the "langbot-plugin-dev" agent skill from https://github.com/langbot-app/LangBot/tree/master/skills/skills/langbot-plugin-dev into .claude/skills/langbot-plugin-dev/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "langbot-plugin-dev", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/langbot-app/LangBot/tree/master/skills/skills/langbot-plugin-devType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add langbot-app/LangBot --skill langbot-plugin-dev -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install langbot-app/LangBot langbot-plugin-dev --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/langbot-app/LangBot.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/skills/langbot-plugin-dev .agents/skills/langbot-plugin-dev && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "langbot-plugin-dev" agent skill from https://github.com/langbot-app/LangBot/tree/master/skills/skills/langbot-plugin-dev into .agents/skills/langbot-plugin-dev/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "langbot-plugin-dev", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add langbot-app/LangBot --skill langbot-plugin-dev -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install langbot-app/LangBot langbot-plugin-dev --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/langbot-app/LangBot.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/skills/langbot-plugin-dev .cursor/skills/langbot-plugin-dev && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "langbot-plugin-dev" agent skill from https://github.com/langbot-app/LangBot/tree/master/skills/skills/langbot-plugin-dev into .cursor/skills/langbot-plugin-dev/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "langbot-plugin-dev", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/langbot-app/LangBot.git --path skills/skills/langbot-plugin-dev--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add langbot-app/LangBot --skill langbot-plugin-dev -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install langbot-app/LangBot langbot-plugin-dev --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/langbot-app/LangBot.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/skills/langbot-plugin-dev .gemini/skills/langbot-plugin-dev && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "langbot-plugin-dev" agent skill from https://github.com/langbot-app/LangBot/tree/master/skills/skills/langbot-plugin-dev into .gemini/skills/langbot-plugin-dev/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "langbot-plugin-dev", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install langbot-app/LangBot langbot-plugin-devInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add langbot-app/LangBot --skill langbot-plugin-dev -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/langbot-app/LangBot.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/skills/langbot-plugin-dev .github/skills/langbot-plugin-dev && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "langbot-plugin-dev" agent skill from https://github.com/langbot-app/LangBot/tree/master/skills/skills/langbot-plugin-dev into .github/skills/langbot-plugin-dev/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "langbot-plugin-dev", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add langbot-app/LangBot --skill langbot-plugin-dev -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install langbot-app/LangBot langbot-plugin-dev --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/langbot-app/LangBot.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/skills/langbot-plugin-dev .opencode/skills/langbot-plugin-dev && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "langbot-plugin-dev" agent skill from https://github.com/langbot-app/LangBot/tree/master/skills/skills/langbot-plugin-dev into .opencode/skills/langbot-plugin-dev/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "langbot-plugin-dev", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
langbot-plugin-devGuides building, debugging and testing LangBot plugins: components, SDK calls, README and locale rules, SDK pitfalls and WebSocket-based testing.
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.
10 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit de886ed. It shows what the files ask for, not the result of running them.
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.
Shell commands in SKILL.md call:
curldockerFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
space.langbot.appFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
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.
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.
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.
The full file from langbot-app/LangBot at commit de886ed, republished under its Apache-2.0 licence (© langbot-app). 975 words, ~3,876 tokens.
.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.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):
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.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.
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.pyEach component has a .yaml (metadata) and .py (implementation).
A plugin published to LangBot Space serves a localized README on its detail page.
The resolver (langbot-space PluginService.GetPluginREADME) works like this:
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.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.mdmanifest.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.
# ❌ 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:list[ContentElement] or str, not a single ContentElementfrom 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")# ❌ WRONG
await self.invoke_llm(llm_model_uuid=uuid, messages=msgs, timeout=60)
# ✅ CORRECT
await self.invoke_llm(llm_model_uuid=uuid, messages=msgs)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)# Returns list[str] of model UUIDs
models = await self.get_llm_models()
model_uuid = models[0] # First available model UUIDKnown 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].
llm_model_uuid, NOT model_uuid# ❌ 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)To fully prevent the default LLM pipeline from responding when your EventListener handles the message, you must call both:
event_context.prevent_default() # Block default behavior
event_context.prevent_postorder() # Block subsequent plugins/pipelineUsing only prevent_default() still allows the LLM to generate a response.
This is a version mismatch between the SDK and host. Wrap storage calls in try/except:
try:
data = await self.get_plugin_storage("my_key")
except Exception:
data = None # Fallback gracefully# ❌ 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# ❌ WRONG
from langbot_plugin.api.definition.base_plugin import BasePlugin
# ✅ CORRECT
from langbot_plugin.api.definition.plugin import BasePluginEvents the EventListener can hook (from most general to most specific):
| Event | When |
|---|---|
GroupMessageReceived | Any group message arrives (before trigger rules) |
PersonMessageReceived | Any private message arrives |
GroupNormalMessageReceived | Group message passes trigger rules, going to LLM |
PersonNormalMessageReceived | Private message going to LLM |
GroupCommandSent | Group message matched as command |
PersonCommandSent | Private message matched as command |
NormalMessageResponded | LLM generated a response |
PromptPreProcessing | About 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.
@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()See references/test-env-setup.md for full deployment steps.
Quick summary:
docker-compose.yaml in server-deploy repo/api/v1/user/init POSTdata/plugins/ directoryLangBot's WebUI chat uses WebSocket. Connect to test message flow:
ws://<host>:<port>/api/v1/pipelines/<pipeline_uuid>/ws/connect?session_type=groupsession_type=group for group chat simulationsession_type=person for private chat (always triggers pipeline)Requires Origin header to pass CORS:
const ws = new WebSocket(url, {
headers: { Origin: 'https://your-langbot-domain' }
});Send messages:
{"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)Group messages only enter the pipeline if trigger rules are met:
{
"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.
There is no hot-reload. After changing plugin files:
docker restart <runtime-container>
# Wait ~5 seconds for plugin to re-mountThe main LangBot container does NOT need restart for plugin changes — only the runtime container.
# 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..."}}# 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"# 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>'Supported type values in manifest.yaml spec.config:
| Type | Description | Value |
|---|---|---|
string | Text input | string |
int / integer | Number input | int |
float | Decimal input | float |
bool / boolean | Toggle | bool |
select | Dropdown (needs options) | string |
prompt-editor | Multi-line prompt editor | string |
llm-model-selector | LLM model picker UI | UUID string |
bot-selector | Bot picker UI | UUID string |
Example — let users choose which model the plugin uses:
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: falseRead config in plugin code:
model_uuid = self.get_config().get("model")After plugin file changes, only the runtime container needs restart:
docker restart langbot-test-runtime
# Wait ~15 seconds before testingWhen to restart both (runtime first, then host):
manifest.yaml structuredocker 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.
When a plugin doesn't work:
docker logs <runtime-container> — look for mount/init errorsdocker logs <langbot-container> — look for pipeline processing errorsGET /api/v1/plugins — should list your pluginsession_type=person always triggers pipeline, isolating trigger rule issuesconfig.ai.runner_config[config.ai.runner.id].model.primary must point to a valid model UUID with working API keysAfter testing, publish via lbp publish:
cd /path/to/MyPlugin
lbp publishThis 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).
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.txtmanifest.yaml — only declare EventListener:
spec:
components:
EventListener:
fromDirs:
- path: components/event_listener/detector.py — hook *MessageReceived, extract text, process, reply:
@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
SKILL.md and 1 other file (references) in skills/skills/langbot-plugin-dev of langbot-app/LangBot.
Open the folder on GitHubat commit de886ed
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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| LangBot Plugin Development this skilllangbot-app/LangBot | 18k | — | ~3.9k | Automated safety check: Pass | Apache-2.0 | |
| MCP Debuggerdebugmcp/mcp-debugger | 171 | — | ~3.8k | Automated safety check: Pass | MIT | |
| Ue Live DebuggingJasonMa0012/MooaToon | 749 | — | ~2.9k | Automated safety check: Notes | Custom licence | |
| SlintMoosync/Moosync | 259 | — | ~2.4k | Automated safety check: Pass | GPL-3.0 | |
| MCP DeveloperJeffallan/claude-skills | 12k | — | ~1.5k | Automated safety check: Pass | MIT | |
| Aris InfraOpenLAIR/dr-claw | 1.2k | — | ~1.4k | Automated safety check: Notes | MIT |
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…
JasonMa0012/MooaToon
A skill your agent uses when debugging UE C++ crashes, runtime bugs, or unexpected behavior with Rider MCP available.
Moosync/Moosync
Expert guidance for building, debugging, and working with Slint GUI applications.
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.
OpenLAIR/dr-claw
ARIS (Auto-claude-code-research-in-sleep) infrastructure setup and configuration.
aiskillstore/marketplace
Nx monorepo management skill for AI-native development. An agent skill from aiskillstore/marketplace.
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.
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.
langbot-app/LangBot
Guides building, migrating and testing LangBot messaging-platform adapters for the Event-Based Agents layout, with unified event and message conversion.
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.
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.
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.
Works with
Categories
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.