Files
LangBot/skills/skills/langbot-testing/references/plugin-e2e-smoke.md
T
Junyan Chin e9dd584792 feat: MCP server + in-repo skills (agent-friendly platform) (#2269)
* feat(api): support global API key from config.yaml (api.global_api_key)

Accept a config-defined global API key anywhere a web-UI key is accepted
(X-API-Key / Bearer), with no login session and no DB record. Useful for
automated deployments and AI agents (HTTP API + MCP). Defaults to empty
(disabled); does not require the lbk_ prefix.

- templates/config.yaml: add api.global_api_key with security notes
- service/apikey.py: verify_api_key checks global key first (constant-time)
- docs/API_KEY_AUTH.md: document the global key + security guidance
- tests: cover global-key match, prefix-free, fallback-to-db, disabled

* feat(mcp): expose LangBot management as an MCP server at /mcp

Add an MCP (Model Context Protocol) server so external AI agents can manage a
LangBot instance. Reuses the same API-key auth as the HTTP API (including the
config.yaml global API key).

- pkg/api/mcp/server.py: FastMCP server wrapping the service layer; 21 curated
  tools across system/bots/pipelines/models/knowledge/mcp-servers/skills
- pkg/api/mcp/mount.py: ASGI dispatcher fronting Quart; authenticates /mcp
  requests with an API key, runs the streamable-HTTP session manager lifespan
- controller/main.py: serve the wrapped ASGI app via hypercorn (was run_task)
- web: new 'MCP' tab in the API integration dialog showing endpoint, auth, and
  client config; i18n for 8 locales
- tests/manual/mcp_smoke.py: e2e check (401 unauth, list tools, call tools)

Tool surface is intentionally curated (not all ~25 route groups) to keep the
agent surface small, safe, and maintainable. Extend deliberately.

* feat(skills): add in-repo skills/ as the single source of truth

Migrate the agent skills + QA/e2e test harness from the (now archived)
langbot-app/langbot-skills repo into LangBot/skills/, and add four new skills.

Migrated:
- langbot-plugin-dev, langbot-testing (e2e), langbot-env-setup,
  langbot-skills-maintenance, langbot-eba-adapter-dev
- the bin/lbs CLI (src/, test/, scripts/, schemas/, qa-agent-docs/)

New:
- langbot-dev      core backend + web development
- langbot-deploy   Docker/K8s deployment + config.yaml + global API key
- langbot-mcp-ops  operating the LangBot MCP server (/mcp)
- langbot-space-ops operating the Space marketplace MCP server

- src/cli.ts repoRoot(): recognize the skills assets root (skills.index.json +
  bin/lbs) so the CLI works when nested inside the LangBot repo
- README.md: unified skill catalog; skills.index.json regenerated

Parity with source verified: bin/lbs validate + node test suite match the
source repo (only the uncommitted .lbpkg build-artifact fixture differs).

* docs(agents): document agent-facing surfaces + API/MCP/skills sync rule

* docs(readme): add 'Built for AI Agents' section across all locales

Highlight MCP server, in-repo skills (single source of truth), AGENTS.md
sync rule, and llms.txt. Cross-link LangBot Space MCP marketplace.

* style(mcp): fix ruff format + prettier lint in MCP server and API panel

* style(web): prettier format MCP i18n locale entries

* docs(skills): note MCP instance control in dev/testing skills

All development-guidance skills now point to the LangBot instance MCP
server (/mcp) and the Space marketplace MCP server, reusing API keys.
2026-06-20 15:14:47 +08:00

2.4 KiB

Plugin E2E Smoke

Use this reference to validate LangBot plugin behavior with a browser-first flow and API/log diagnostics.

Fixture

Use the bundled local plugin source:

fixtures/plugins/qa-plugin-smoke

It registers:

  • Plugin id: qa/plugin-smoke
  • Tool: qa_echo(text: string) returning qa-plugin-smoke:<text>
  • Tool: qa_plugin_echo(text: string) returning qa-plugin-smoke:<text>
  • Tool: qa_plugin_sleep(seconds: number, text: string) returning qa-plugin-smoke:sleep:<seconds>:<text> after a bounded delay
  • Page: smoke, with an HTML asset and a backend page API sentinel qa-plugin-smoke-page

SDK Under Test

When validating a local SDK build, install it into the LangBot worktree virtualenv:

cd "$LANGBOT_REPO"
uv pip install -e /absolute/path/to/langbot-plugin-sdk-test-build
uv run --no-sync python -c "import langbot_plugin, pathlib; print(pathlib.Path(langbot_plugin.__file__).resolve())"

The printed path must point into the local SDK source tree. Use uv run --no-sync for LangBot startup and tests; plain uv run may sync the lockfile and restore the PyPI package.

Build The Fixture

From the fixture directory, build with the same SDK that LangBot will run:

cd skills/langbot-testing/fixtures/plugins/qa-plugin-smoke
"$LANGBOT_REPO/.venv/bin/lbp" build

The generated zip under dist/ is the file to upload from the WebUI.

Browser Flow

  1. Start or verify backend and frontend.
  2. Open LANGBOT_FRONTEND_URL.
  3. Initialize or log in to the test instance.
  4. Navigate to Plugins.
  5. Choose local plugin install and upload the generated qa-plugin-smoke zip.
  6. Wait for the install task to finish.
  7. Confirm the plugin list/detail shows QA Plugin Smoke, qa_echo, and Smoke Page.
  8. Open the plugin extension page if it appears in the sidebar and verify it renders the sentinel text.

Diagnostic Checks

Use API checks only to confirm what the UI exercised:

  • GET /api/v1/plugins contains qa/plugin-smoke with initialized status.
  • GET /api/v1/tools contains qa_echo, qa_plugin_echo, and qa_plugin_sleep.
  • POST /api/v1/plugins/qa/plugin-smoke/page-api with page_id=smoke, endpoint=/ping, method=GET returns qa-plugin-smoke-page.
  • Backend logs include Connected to plugin runtime and no Action ... call timed out entries.

Cleanup

Delete qa/plugin-smoke through the WebUI or DELETE /api/v1/plugins/qa/plugin-smoke?delete_data=true after recording results.