lampa-mcp-server
This MCP server provides AI agents with structured, read-only access to the Lampa TV app source code, enabling deep understanding, planning, and code generation for Lampa development.
Repository Exploration
Summarize structure, list modules/files/scripts, search code with regex, read file segments.Feature & Architecture Analysis
Locate feature-specific files, map module dependencies and reverse dependencies, conduct impact and risk scans, deep‑analyze plugins and components, extract the full Lampa API surface, storage schema, network map, and UI templates.Event & Data Flow
Trace events to emitters/listeners, map the event bus, and follow data flows.Settings, API & Style Lookup
Find settings registrations, external API calls, styles per module, translation keys, and coverage gaps; list streaming providers and extract template HTML.Planning & Code Generation
Generate step‑by‑step feature plans, suggest optimal edit targets, draft patches, insert hooks, add setting boilerplate, scaffold entire plugins, and generate ready‑to‑use plugin code.Validation & Quality
Validate plugins against conventions, run code‑quality checks (TODOs, console.logs, missing translations), find related tests, get build hints, and perform documentation lookups.
All tools are read‑only and designed for intelligent code discovery, analysis, and assisted Lampa app development.
Provides reference guidance for integrating Lampa with Jellyfin's content API, helping plugin authors use Jellyfin as a third-party content provider.
Provides reference guidance for integrating Lampa with Kinopoisk's content API, helping plugin authors use Kinopoisk as a third-party content provider.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@lampa-mcp-serverList all streaming providers in the codebase"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
lampa-mcp-server
An MCP server for AI-assisted development on the Lampa open-source TV app.
It gives AI agents (Claude, Cursor, etc.) structured, read-only access to the Lampa source tree — so they understand the repo before making changes.
Runs in two modes:
Local stdio — Node process spawned by Cursor / Claude Desktop (unchanged workflow)
Cloudflare Workers — remote Streamable HTTP MCP at
/mcpwith GitHub PAT auth and an R2 source snapshot
What it does
The server exposes 16 tools (plus Worker-only whoami) and curated resources (lampa://plugin-guide, lampa://pitfalls, lampa://events, lampa://landmarks, lampa://edit-rules, lampa://api-surface). Tools are read-only: they never write the Lampa repo.
Tool | Role |
| Snapshot metadata, tree, scripts, optional module listing |
| Content/regex search |
| Paths by name, feature, UI, styles, or specs |
| File / core module / template bytes |
| One plugin folder (+ load path if name omitted) |
| Catalogs (API, events, storage, Maker, …) |
| Follow one event, component, file, or deprecated API |
| Plugin docs, patterns, packaging |
| Plan + targets + impact + risks |
| Suggested diffs (does not write) |
| New plugin / setting / hook text (does not write) |
| Plugin score, grep, i18n, build hint |
| CUB APIs as used in Lampa source |
| Authoritative |
| Third-party content APIs (TMDB, KinoPoisk, Alloha, MDBList, Jackett, TorrServer, Jellyfin) |
| Real plugin-catalog packaging/publishing pipeline (manifest, obfuscation, routing) |
Preferred agent loop:
summarize_repo → explain_docs(mode=plugin_docs) | analyze_plugin
→ search_code | list_catalog | trace_symbol
→ resolve_edit_path → plan_change → scaffold_plugin | draft_patch
→ validate_codeUse resolve_edit_path before editing so you change src/ / plugins/ rather than public/ or build/.
Third-party content-provider APIs (TMDB/KinoPoisk/Alloha/MDBList/Jackett/TorrServer/Jellyfin): guide_external_api. Shipping a plugin into the real lampa-plugins catalog: guide_plugin_catalog. Both are static, curated references — they never expose real credentials and never touch this repo's snapshot.
Related MCP server: codemap
Requirements
Node.js 20+
For local mode: a checkout of lampa-source
For Workers mode: a Cloudflare account, R2 bucket, KV namespace, and a GitHub Personal Access Token (
read:user)
Local stdio setup
git clone <this-repo>
cd lampa-mcp-server
npm install
npm run build
export LAMPA_REPO_PATH=/path/to/lampa-source
npm startClaude Desktop
{
"mcpServers": {
"lampa-mcp-server": {
"command": "node",
"args": ["/absolute/path/to/lampa-mcp-server/dist/index.js"],
"env": {
"LAMPA_REPO_PATH": "/absolute/path/to/lampa-source"
}
}
}
}Cursor
{
"mcpServers": {
"lampa-mcp-server": {
"command": "node",
"args": ["/absolute/path/to/lampa-mcp-server/dist/index.js"],
"env": {
"LAMPA_REPO_PATH": "/absolute/path/to/lampa-source"
}
}
}
}Cloudflare Workers (remote MCP)
Architecture: createMcpHandler (MCP SDK v2, stateless) + R2 Lampa snapshot + GitHub PAT auth via resolveExternalToken on @cloudflare/workers-oauth-provider.
1. Create Cloudflare resources
npx wrangler r2 bucket create lampa-mcp-source
npx wrangler kv namespace create OAUTH_KVPut the returned KV namespace id into wrangler.jsonc (kv_namespaces[0].id).
2. Create a GitHub Personal Access Token
Create a classic or fine-grained PAT with at least read:user.
No GitHub OAuth App / GITHUB_CLIENT_ID / GITHUB_CLIENT_SECRET is required.
Optional allowlist (comma-separated GitHub logins) in wrangler.jsonc vars or .dev.vars:
ALLOWED_GITHUB_USERS=your-login,coworker3. Upload a Lampa source snapshot to R2
# clone Lampa if needed
git clone https://github.com/yumata/lampa-source temp/lampa-source
# local Miniflare R2 (for wrangler dev)
npm run snapshot:upload:local
# production R2
npm run snapshot:uploadObjects land under lampa/manifest.json, lampa/bundle.json (all source text), and lampa/indexes/*.json.
4. Deploy
npm run types:worker
npm run deployMCP endpoint: https://lampa-mcp-server.<account>.workers.dev/mcp
5. Connect a remote MCP client
Pass the GitHub PAT as a Bearer token. Cursor example:
{
"mcpServers": {
"lampa": {
"url": "https://lampa-mcp-server.<account>.workers.dev/mcp",
"headers": {
"Authorization": "Bearer ghp_YOUR_GITHUB_PAT"
}
}
}
}Or via mcp-remote:
{
"mcpServers": {
"lampa": {
"command": "npx",
"args": [
"mcp-remote",
"https://lampa-mcp-server.<account>.workers.dev/mcp",
"--header",
"Authorization: Bearer ghp_YOUR_GITHUB_PAT"
]
}
}
}Prefer storing the PAT in env / secret storage rather than committing it to mcp.json.
Local Worker development
npm run snapshot:upload:local
npm run dev:workerThen point the MCP inspector / client at http://localhost:8787/mcp with Authorization: Bearer <pat>.
Recommended agent workflow
summarize_repo → explain_docs(mode=plugin_docs) | analyze_plugin
→ search_code | list_catalog | trace_symbol
→ resolve_edit_path → plan_change → scaffold_plugin | draft_patch
→ validate_codePlugin authoring must follow official docs/en (Listener app:ready, SettingsApi, double-load guard). Do not emit $(document).on('appready') or Lampa.Settings.add.
For CUB account/sync work:
guide_cub(topic=auth) → guide_cub(topic=catalog) → guide_cub(topic=sync)
→ guide_cub(topic=models) → guide_cub(topic=endpoint)Breaking change (v1.x → verb_noun tools)
Aliases, thin wrappers, and v1.7 noun-first names were removed so the catalog stays in the 3–15 range Glama scores. Call the replacement instead:
Removed | Use instead |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Project structure
src/
├── index.ts # Local stdio entry
├── worker.ts # Cloudflare Worker + PAT auth entry
├── server.ts # Shared createLampaServer factory
├── config.ts # Local Config (NodeRepoFs)
├── auth/github-handler.ts # Public pages + GitHub PAT validation
├── fs/ # RepoFs: types, Node, R2, paths
├── utils/ # Async analysis helpers
├── tools/ # MCP tools
└── resources/ # MCP resources
scripts/
└── upload-snapshot.mjs # R2 snapshot + index uploader
wrangler.jsoncDevelopment
npm run build # wrangler types + tsc → dist/
npm run dev # build, then run stdio server
npm start # run compiled stdio server
npm run typecheck # wrangler types + tsc --noEmit
npm run lint
npm run format
npm run types:worker # regenerate worker-configuration.d.ts (gitignored)
npm run dev:worker # wrangler dev
npm run deploy # wrangler deploy
npm run snapshot:upload:local
npm run snapshot:uploadDependencies (what / why)
Package | Role |
| MCP SDK (stdio + shared server factory) |
| Workers MCP handler ( |
| Worker auth wrapper (PAT via |
| Public HTML routes ( |
| Tool input schemas |
| TypeScript 6 compiler + types for |
| Deploy, |
| Lint / format |
Runtime deps ship with both the stdio CLI and the Worker. Dev deps are local-only.
License
MIT
Available Tools
16 toolsanalyze_pluginAnalyze one Lampa plugin folderARead-onlyIdempotent
Single-call report for one plugins/<name> folder: files, Lampa.* usage, Listener follow/send, settings, CSS, and an entry preview truncated to ~30 lines, plus how Lampa loads plugins (src/core/plugins.js).
Unlike list_catalog this is scoped to one plugin, unlike trace_symbol it does not follow a single event/file across the repo, unlike validate_code it does not score conventions.
Entry file is chosen as main.js, else <plugin>.js, else the first .js file found — plugin itself must be just the case-sensitive directory name (e.g. online, iptv, never a plugins/ prefix or nested path), not a manifest id; omit it for load-path-only output; an unknown folder errors and lists available folders instead of guessing.
| Name | Required | Description | Default |
|---|---|---|---|
| plugin | No | Case-sensitive plugins/ directory name (not a manifest id), e.g. 'online', 'iptv', 'collections'. Omit for load-path only. |
Output Schema
| Name | Required | Description |
|---|---|---|
| markdown | Yes | Human-readable markdown report. Always present, including empty-result cases. Does not write files. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety bar is low; the description still adds real behavior: entry-file resolution precedence (main.js → <plugin>.js → first .js), output truncation to ~30 lines, and that an unknown folder errors and lists available folders rather than guessing. The only gap is no note on output size/pagination beyond the truncation hint, which the output schema largely covers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the deliverable, then the sibling contrasts, then the parameter rules and error behavior — a sensible priority order with zero filler sentences. It is dense and the third clause chains three 'unlike' comparisons plus the entry-resolution and path-validation rules into one long passage, which costs some scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with full annotation coverage and an output schema, this is complete: report contents, path validation rules, entry-file fallback order, truncation, and error behavior are all stated. An agent has everything needed to call it correctly on the first attempt.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema description already states case-sensitivity, the 'not a manifest id' caveat, and the omit behavior, so much of the description restates it. It nevertheless adds a constraint absent from the schema ('never a plugins/ prefix or nested path') and ties the parameter to the entry-file selection logic, which is genuine added meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource ('Single-call report for one plugins/<name> folder') and enumerates exactly what the report contains: files, Lampa.* usage, Listener follow/send, settings, CSS, and an entry preview. It also explicitly differentiates itself from three siblings (list_catalog, trace_symbol, validate_code), so the agent can pick it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules via 'unlike list_catalog... unlike trace_symbol... unlike validate_code', which tells the agent both when this tool wins and which alternative to use instead. It also states the omit-parameter case ('omit it for load-path-only output') and the failure mode, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_patchDraft a Lampa unified diffARead-onlyIdempotent
Returns TODO unified diffs as text only — does not write the repository.
Best with plan_context pasted from plan_change; unlike plan_change, this invents concrete diff hunks; unlike scaffold_plugin, it patches existing files rather than emitting new-plugin boilerplate.
target_files, when given, fully overrides inference (the two are never combined) and is capped at the first 5 entries for diff generation even if more are passed (the 'Target files' summary section still lists up to 6); without it, up to 5 files are inferred from request alone, which is weaker than passing plan_context's target list explicitly.
Missing files get a 'File not found' note instead of aborting the whole call; the @@ hunks are suggested, not guaranteed to apply — always re-check against read_source before applying by hand.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | The change to implement. | |
| plan_context | No | Optional paste of plan_change output. Recommended; the tool still runs without it. | |
| target_files | No | Repo-relative files to patch. If omitted, up to 5 files are inferred from request (weaker than plan_context). |
Output Schema
| Name | Required | Description |
|---|---|---|
| markdown | Yes | Human-readable markdown report. Always present, including empty-result cases. Does not write files. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior, but the description adds critical operational details: output is text-only, `target_files` fully overrides inference and is never combined with it, inference is capped at 5 files even if more are passed, missing files produce a note rather than aborting, and hunks are suggestions that should be re-checked before applying.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded with the key constraint ('text only — does not write the repository') and then layers useful caveats. Most sentences carry operational value, though the parenthetical cap details and the 'TODO' phrasing are slightly awkward and could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return format explanation is unnecessary, and the description covers the remaining decision-critical behavior: non-writing nature, precedence of `target_files`, inference limits, missing-file handling, and non-guaranteed patch applicability. Nothing substantial is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents each parameter. The description still adds meaningful semantics beyond the schema: `target_files` fully overrides inference rather than supplementing it, is capped at the first 5 entries for diff generation even if more are passed, and the summary section lists up to 6. It also explicitly characterizes inference without `plan_context` as weaker.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns ... unified diffs as text only') and immediately clarifies it does not write the repository. It explicitly distinguishes itself from plan_change and scaffold_plugin, so an agent can select it without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names alternatives (`plan_change`, `scaffold_plugin`) and explains the selection conditions: plan_change produces plans, scaffold_plugin emits new-plugin boilerplate, and draft_patch patches existing files with concrete hunks. It also recommends pasting `plan_context` from `plan_change` and explains when `target_files` should be supplied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explain_docsExplain Lampa docs, patterns, or packagingARead-onlyIdempotent
Read written Lampa guides: official plugin chapters (mode=plugin_docs), a core development pattern with live snippets (mode=pattern), or gulp/npm packaging targets (mode=packaging). Not a live API catalog (list_catalog) and not grep (search_code). Example: chapter=pitfalls vs query='SettingsApi' when chapter is omitted; omit both for the TOC; lang is en (default) or ru; pattern requires the pattern enum; unknown chapter → error listing known ids. Snapshot-only; packaging reads gulpfile.js / package scripts — it does not execute gulp or npm.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | For plugin_docs: docs language. Default en. | |
| mode | Yes | plugin_docs=docs/en|ru; pattern=guide+live examples; packaging=gulp/npm targets. | |
| query | No | For plugin_docs: search headings/body when chapter is omitted. Also used as fallback topic. | |
| chapter | No | For plugin_docs: chapter id or alias (pitfalls, settings, player, 01–13). | |
| pattern | No | For mode=pattern: which development pattern to explain. |
Output Schema
| Name | Required | Description |
|---|---|---|
| markdown | Yes | Human-readable markdown report. Always present, including empty-result cases. Does not write files. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only and idempotent, and the description adds valuable non-obvious behavior: snapshot-only, packaging reads configuration but does not execute gulp/npm, and unknown chapter returns an error listing known ids. This meaningfully extends the structured hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with the core resource and modes front-loaded before details. Every clause earns its place, and there is no filler or redundant restatement of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-mode tool with five parameters, three enums, and an output schema, this description is complete: it covers mode selection, parameter interplay, error behavior, side-effect boundaries, and sibling differentiation. An agent has what it needs to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds interaction semantics not present in the schema: chapter vs query when chapter is omitted, omitting both gives the TOC, lang is en or ru, and pattern requires the pattern enum. This materially improves correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read written Lampa guides') and enumerates three distinct modes, immediately differentiating itself from list_catalog and search_code. An agent can tell exactly what this tool covers without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance per mode and names alternatives not to use: 'Not a live API catalog (list_catalog) and not grep (search_code)'. It also explains chapter/query fallback behavior, the TOC case, lang default, and the pattern requirement, so selection and invocation conditions are concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_filesFind Lampa files by name or featureARead-onlyIdempotent
Locate repo-relative paths by filename, Lampa feature, UI component, stylesheet, or spec — a path finder, not content grep. Unlike search_code, this matches names/paths (except mode=ui/styles, which also attach up to 20/15 content hits); unlike read_source, it does not return file bytes.
Example: mode=feature query='player' uses the built-in feature map; mode=name query='full' ext='.js' filters by extension. ext is honored only when mode=name; passing it with mode=feature/ui/styles/tests is silently ignored rather than erroring, so those modes always return every matching extension. Empty matches → list, not an error.
| Name | Required | Description | Default |
|---|---|---|---|
| ext | No | For mode=name only: extension filter, e.g. '.js' or '.scss'. Ignored otherwise. | |
| mode | No | name (default)=filename substring; feature=built-in Lampa feature map + filename; ui=templates/components (+ up to 20 content hits); styles=css/scss (+ up to 15 content hits); tests=spec files. | |
| query | Yes | Filename substring (mode=name), feature name (mode=feature, e.g. player/catalog/iptv), UI component, style module, or spec keyword. |
Output Schema
| Name | Required | Description |
|---|---|---|
| markdown | Yes | Human-readable markdown report. Always present, including empty-result cases. Does not write files. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive and closed-world, so the bar is lower, yet the description still adds real behavioral detail: `mode=ui`/`styles` attach up to 20/15 content hits, `ext` is silently ignored rather than erroring in non-name modes, and empty matches return an empty list rather than an error. These are non-obvious behaviors an agent would otherwise discover by failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and sibling contrast, then examples, then edge cases; every sentence contributes. It loses a point for mild overlap with the schema, which already states that `ext` applies only to `mode=name`.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the description covers mode semantics and failure behavior. Minor gap: it does not say whether `mode=name` results are capped or ordered the way `ui`/`styles` content hits are, so the agent cannot predict result volume in the default mode.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so a 3 is the baseline, but the description goes beyond the schema by giving concrete `query` examples per mode, noting the built-in feature map, and explaining the silent-ignore semantics of `ext` (the schema says 'ignored otherwise' but not that it will not error). That is meaningful added semantics rather than restatement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Locate repo-relative paths') plus the dimensions it searches (filename, feature, UI component, stylesheet, spec) and immediately frames itself as 'a path finder, not content grep.' It explicitly contrasts with the siblings `search_code` and `read_source`, so an agent can discriminate without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names alternatives and the conditions that select them: use `search_code` for content grep, `read_source` for file bytes, this tool for name/path lookup. It also supplies per-mode usage examples (`mode=feature query='player'`, `mode=name query='full' ext='.js'`), leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
guide_cubGuide to CUB cloud APIs in LampaARead-onlyIdempotent
Document how Lampa talks to CUB from source — this makes no network calls of its own (pure snapshot read, no auth needed to call this tool), and is not a substitute for cub.rip/developer. Returns markdown text (see output schema), never raw JSON. Unlike list_catalog topic=mirrors/socket, this is CUB-specific.
topic=catalog lists REST paths (category/search filter the catalog only, no effect on other topics); endpoint requires path (e.g. bookmarks/dump) and ignores category/search; auth reads auth_focus only (device/add, headers, Permit, Premium, mirrors); models reads model only (bookmark/timeline/favorite shapes); sync takes no parameters and maps dump/changelog/WebSocket; timeline_hash reads example only and explains Utils.hash. Passing any parameter that does not apply to the chosen topic is silently ignored, never an error.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | For topic=endpoint: path such as 'bookmarks/dump' or 'device/add'. | |
| model | No | For topic=models: which schema. Default all. | |
| topic | Yes | catalog=endpoint table; endpoint=one path; auth=login/headers; models=schemas; sync=dump/changelog; timeline_hash=hash algorithm. | |
| search | No | For topic=catalog: filter by path substring. | |
| example | No | For topic=timeline_hash: worked example. | |
| category | No | For topic=catalog: filter by API category. Default all. | |
| auth_focus | No | For topic=auth: focus area. Default overview. |
Output Schema
| Name | Required | Description |
|---|---|---|
| markdown | Yes | Human-readable markdown report. Always present, including empty-result cases. Does not write files. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, but the description adds material behavior the annotations cannot express: no network calls of its own, pure snapshot read, no auth required to invoke, and markdown rather than raw JSON output. These are real operational facts an agent needs and none contradict the hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense but well-ordered paragraph: identity/scope first, then the non-substitute warning, then a topic-by-topic parameter map. Every clause carries routing or semantics information; nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 7 parameters, 5 enums, a required topic, and an output schema already in place, the description covers the remaining risk area — which params apply to which topic and what happens when they don't — and confirms the return format. Nothing material is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description goes further by defining the cross-parameter applicability matrix per topic (e.g. `endpoint` requires `path` and ignores `category`/`search`), which the flat schema cannot express. Example values like `bookmarks/dump` reinforce the format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Document how Lampa talks to CUB from source') and immediately scopes what it is not (a substitute for cub.rip/developer). It also distinguishes itself from the sibling tool `list_catalog` topic=mirrors/socket, so an agent can route correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description enumerates each `topic` value and states exactly which parameters it honors (catalog→category/search, endpoint→path, auth→auth_focus, models→model, sync→none, timeline_hash→example). It even states the failure-tolerance rule ('silently ignored, never an error'), which is explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
guide_external_apiGuide to third-party content-provider APIs used by Lampa pluginsARead-onlyIdempotent
Document the real-world content/ratings/torrent-indexer/media-server APIs that Lampa plugins call — TMDB, KinoPoisk (PoiskKino + Unofficial), Alloha, MDBList, Jackett/Prowlarr/JacRed, TorrServer, Jellyfin, TheIntroDB, and the CORS-proxy pattern that fronts them. This is curated from the separate lampa-plugins repository, not the Lampa app source — unlike guide_cub (Lampa→CUB backend only) and unlike list_catalog (Lampa's own API/event/storage surface).\nNever returns secret values (API keys, tokens, passwords) — only provider identity, auth mechanism, and the Lampa.Storage key names a plugin reads credentials from.\ntopic=providers lists all providers (search filters by id/name/category/description); provider_detail requires provider; proxy_pattern takes no parameters and explains the shared Worker-proxy design once for all providers.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | providers=list/search all providers; provider_detail=one provider's auth/storage/usage; proxy_pattern=shared CORS/credential-hiding Worker design. | |
| search | No | For topic=providers only: filter by id, name, category, or description substring. | |
| provider | No | Required for topic=provider_detail, e.g. 'tmdb', 'kinopoisk_unofficial', 'alloha', 'mdblist', 'jackett', 'torrserver'. Ignored otherwise. |
Output Schema
| Name | Required | Description |
|---|---|---|
| markdown | Yes | Human-readable markdown report. Always present, including empty-result cases. Does not write files. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds meaningful behavioral context beyond that: it is curated from a separate repository, not the Lampa app source, and it never returns API keys/tokens/passwords, only identity, auth mechanism, and storage key names. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: scope, exclusions, security boundary, and parameter routing. It is front-loaded with the core purpose and avoids filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the annotations cover safety, the output schema exists, and the schema covers all parameters, the description provides complete context for selecting and invoking the tool. It also notes the provenance and security boundary, which are important contextual facts an agent would otherwise not know.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by explaining the operational meaning of each topic value: providers lists/searches, provider_detail requires provider, and proxy_pattern takes no parameters and explains the shared design once. This goes slightly beyond the schema's property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Document') with a clearly bounded resource: third-party content/ratings/torrent-indexer/media-server APIs used by Lampa plugins. It explicitly enumerates the covered providers and distinguishes itself from guide_cub and list_catalog, so an agent can disambiguate it without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly names sibling tools it is unlike (guide_cub for Lampa→CUB only, list_catalog for Lampa's own surface) and provides routing rules for the three topic values. It also states a hard constraint: never return secret values. This gives clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
guide_plugin_catalogGuide to publishing plugins into the real Lampa plugin catalogARead-onlyIdempotent
Document how the separate lampa-plugins repository turns plugin source files into the live catalog agents install into Lampa: the extension.json/plugin-manifest.json schema, the obfuscation presets, Cloudflare Pages Functions routing, and a step-by-step publishing checklist. Curated from that repo's scripts/ and functions/, not from the Lampa app source — unlike validate_code (lints one plugin's code against Lampa conventions) and scaffold_plugin (emits new-plugin boilerplate text), this tool covers packaging and distribution once the plugin already works.\nEach topic takes no other parameters and returns a fixed reference document — it does not read this repo's snapshot and never writes files.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | manifest=extension.json/plugin-manifest.json schema; obfuscation=javascript-obfuscator presets; routing=Cloudflare Pages _routes.json/_headers; functions_api=the three Pages Functions endpoints; publishing_checklist=ordered steps to ship a new plugin. |
Output Schema
| Name | Required | Description |
|---|---|---|
| markdown | Yes | Human-readable markdown report. Always present, including empty-result cases. Does not write files. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, but the description adds meaningful behavioral context: it returns a fixed reference document, does not read this repo's snapshot, and never writes files. It also discloses that content is curated from the lampa-plugins repo rather than the Lampa app source, which is not inferable from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two dense sentences, front-loaded with the core purpose, then source provenance, sibling differentiation, and side-effect clarification. Every sentence earns its place with no filler or redundant restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the small parameter surface, full schema coverage, and provided annotations, the description is complete: it explains scope, source, behavior, constraints, and sibling boundaries. An agent can confidently decide to invoke this tool and with which topic.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers the single topic parameter fully (100%) with an enum and per-value descriptions, so the baseline is 3. The description reinforces that each topic returns a fixed reference document but does not add deeper meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Document how the separate lampa-plugins repository turns plugin source files into the live catalog'), names the covered topics, and explicitly contrasts itself with validate_code and scaffold_plugin. This makes the tool's purpose unmistakable and differentiates it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says this tool covers packaging and distribution 'once the plugin already works' and names the sibling tools it is not (validate_code, scaffold_plugin). This gives clear when-to-use and when-not-to-use guidance, with alternatives called out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_catalogCatalog Lampa APIs and indexesARead-onlyIdempotent
Dump one static catalog from the Lampa snapshot per call. Returns markdown text, not JSON, with no performance cost beyond one tree walk. Not a query (search_code), not a single-symbol walk (trace_symbol), not written docs (explain_docs), and not a live CUB client (guide_cub).
scope applies only to api_surface/events/storage (default all); detail=true only affects events; query is a plain substring filter (module name, event name, storage key, component name, flag keyword, or network folder) within the chosen topic — never a repo-wide search.
Example: topic=events query='player' detail=true. Empty catalog → markdown, not an error; on R2, full-tree events/storage need a prebuilt index — pass query or a narrower topic (e.g. maker, socket, flags, content_rows, favorites, mirrors) if the index is missing.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Filter the chosen catalog only (not a repo-wide search): API module, event name, storage key, component name, flag keyword, or folder (for network). | |
| scope | No | For api_surface, events, storage: limit the tree. Default all. | |
| topic | Yes | Which catalog: api_surface | events | storage | network | settings | providers | maker | socket | activity | flags | content_rows | favorites | mirrors. | |
| detail | No | For topic=events: include per-file listener/emitter lists. Default false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| markdown | Yes | Human-readable markdown report. Always present, including empty-result cases. Does not write files. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, non-destructive, and closed-world behavior, but the description adds important context beyond them. It discloses that output is markdown rather than JSON, that cost is one tree walk, that an empty catalog is not an error, and that full-tree events/storage on R2 may require a prebuilt index.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description front-loads purpose, then covers sibling alternatives, parameter constraints, an example, and edge-case behavior. It is dense but appropriately sized for a catalog tool with multiple topics and operational caveats.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, annotations cover safety, and schema descriptions are complete. The description still adds useful index-missing guidance and clarifies empty-result behavior, so an agent has enough information to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds that query is a plain substring filter and gives an example combining topic, query, and detail, but most scope/detail/topic semantics are already fully documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It states a specific action and resource: dumping one static catalog from the Lampa snapshot. It immediately distinguishes the tool from four sibling behaviors: search_code, trace_symbol, explain_docs, and guide_cub. An agent can recognize this as static catalog retrieval rather than search, tracing, documentation, or live CUB access.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says what the tool is not and names the alternatives, giving clear routing guidance. It also explains when to use query or a narrower topic if the R2 index is missing, and provides a concrete example with topic=events, query='player', and detail=true.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_changePlan a Lampa feature changeARead-onlyIdempotent
Generate a step-by-step implementation plan with inferred targets, a reverse-ref sample, and coupling risks for a Lampa change. Call this before draft_patch; unlike draft_patch it does not invent diffs, unlike trace_symbol it covers a whole request rather than one file/event, unlike scaffold_plugin it plans edits to existing code. request='add a sleep timer' + scope_hint='player' concatenates into feature inference; empty inference still returns a plan (not an error). Snapshot-only — does not execute or write; heuristic — not a guarantee; affected-surface list caps at ~12 files.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | Plain-language description of the change, e.g. 'add a sleep timer to the player'. | |
| scope_hint | No | Optional hint for which feature area is involved, e.g. 'player' or 'plugins/iptv'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| markdown | Yes | Human-readable markdown report. Always present, including empty-result cases. Does not write files. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate read-only, non-destructive, idempotent behavior, and the description adds meaningful context beyond that: snapshot-only, no execution/writes, heuristic not a guarantee, and affected-surface list capped at ~12 files. No contradiction exists between the description and annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence in the description carries distinct information: purpose, usage order and exclusions, parameter behavior, and operational caveats. It is dense but well-structured, with the core purpose front-loaded before supporting details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a planning tool of this complexity. Since an output schema exists, return-value details are not required, and the description covers usage order, sibling distinctions, parameter semantics, and behavioral limitations in enough depth for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, so request and scope_hint are documented. The description adds valuable semantic context: how request and scope_hint concatenate into feature inference and that empty inference still produces a plan rather than an error.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb and resource: generating a step-by-step implementation plan with inferred targets, a reverse-ref sample, and coupling risks. It is immediately distinguishable from siblings through explicit contrasts with draft_patch, trace_symbol, and scaffold_plugin.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to call this tool before draft_patch and explains what it does not do compared to draft_patch, trace_symbol, and scaffold_plugin. It also covers behavior like empty inference still returning a plan, so an agent knows when the tool remains usable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_sourceRead Lampa source file bytesARead-onlyIdempotent
Read bytes from one known path: a repo file, a src/core module, or a src/templates template. Unlike search_code/find_files, this returns contents of a single target — do not dump catalogs (list_catalog). Full files truncate at max_lines (default 300); pass start_line+end_line (1-based, inclusive) for a range (ignores max_lines); kind=file requires file; omit file with kind=core/template to list; missing path → error.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | Repo-relative path, core module name (kind=core), or template name (kind=template). Required for kind=file. | |
| kind | No | file (default)=any path; core=src/core module; template=src/templates markup. | |
| end_line | No | Last line to read (inclusive). Pair with start_line. | |
| max_lines | No | Cap when reading a full file. Default 300. Ignored when start_line/end_line are set. | |
| start_line | No | First line to read (1-based). Pair with end_line. | |
| template_mode | No | For kind=template: list catalog, html markup, or raw JS. Default list when file omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| markdown | Yes | Human-readable markdown report. Always present, including empty-result cases. Does not write files. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as readonly and idempotent, and the description adds valuable behavioral details: full-file truncation at max_lines, the range behavior ignoring max_lines, the missing-path error, and the kind-dependent behavior. These details are not inferable from the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every clause earns its place: scope is front-loaded, sibling distinctions come next, and then concrete behavioral rules and error handling. There is no filler or redundant restatement of the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter read tool with rich annotations, an output schema, and several sibling tools, the description covers selection, parameter interactions, defaults, and error outcomes. An agent has everything needed to invoke it correctly without needing additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description still adds meaning beyond the schema: it documents the default max_lines of 300, the precedence of start_line/end_line over max_lines, the file-required rule for kind=file, and the omit-file listing behavior. This goes well beyond the individual parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence clearly states the tool reads bytes/contents from one known path: a repo file, a src/core module, or a src/templates template. It also differentiates itself from search_code/find_files and explicitly warns against list_catalog, so an agent can identify its exact purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use this tool versus alternatives: it returns a single target's contents, unlike search_code/find_files, and should not be used to dump catalogs. It also provides per-kind invocation rules, such as kind=file requiring a file and omitting file with core/template to list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_edit_pathResolve authoritative Lampa edit pathARead-onlyIdempotent
Map a change kind (lang, sass, template, component, plugin, core, interaction, settings) to the authoritative src/ or plugins/ path and list generated public/build copies to avoid. Call this before plan_change or draft_patch; unlike find_files, this is a fixed landmark table look-up (no filesystem walk, no content search), not a search.
Example: kind=plugin name='tracks' returns plugins/tracks specifically, vs kind=lang name='en' returns src/lang/en.js; an unrecognized name does not fail — it falls back to the kind's default authoritative/avoid paths so the call always returns something actionable. name has no effect for kind=sass or kind=settings — those paths are fixed and have no per-name variant, so it is silently ignored there.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | What kind of source you intend to change. | |
| name | No | Optional plugin id (e.g. 'tracks') or lang code (e.g. 'en'). Unknown values still return the kind's default paths. |
Output Schema
| Name | Required | Description |
|---|---|---|
| markdown | Yes | Human-readable markdown report. Always present, including empty-result cases. Does not write files. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, closed-world, non-destructive), and the description adds behavior beyond that: no filesystem walk or content search, graceful fallback on unrecognized `name` so the call 'always returns something actionable', and silent ignoring of `name` for sass/settings. These are exactly the traits an agent needs to predict outcomes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical routing constraint ('call before plan_change/draft_patch') and the contrast with find_files are front-loaded, and every sentence carries information. It is slightly dense with examples and edge-case clauses packed into one long paragraph, which costs a point against a tighter structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, read-only lookup with an output schema (so return values needn't be described), the description covers ordering relative to siblings, fallback behavior, and kind-specific edge cases. Nothing essential for calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics beyond the schema: it enumerates what each `kind` maps to with two worked examples, states `name` has no effect for `kind=sass` and `kind=settings`, and clarifies the fallback for unknown names. That is meaning the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Map') and resource ('a change kind ... to the authoritative src/ or plugins/ path'), lists the exact enum values, and explicitly contrasts itself with `find_files` as a fixed landmark look-up rather than a search. An agent can distinguish it from every sibling without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit precondition ('Call this before `plan_change` or `draft_patch`') and a negative rule ('unlike `find_files`, this is a fixed landmark table look-up ... not a search'). The two concrete examples (kind=plugin vs kind=lang) further pin down intended use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scaffold_pluginGenerate Lampa plugin, setting, or hook textARead-onlyIdempotent
Returns markdown only; does not write the repository — not a patch against existing files (draft_patch).
kind=plugin emits a full main.js scaffold: requires plugin_name + description; plugin_kind (screen default | player | context-menu | settings-only) applies only here.
kind=setting emits a SettingsApi registration snippet: requires key + label + type (type=toggle aliases trigger).
kind=hook emits the best-matching Listener/Player hook: requires trigger.
A missing required combo for the chosen kind errors instead of returning a partial scaffold. Follow up with validate_code mode=plugin on the result.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | For kind=setting: Storage key, e.g. 'myplugin_enabled'. Prefix with plugin name. | |
| kind | Yes | plugin=full main.js scaffold; setting=SettingsApi snippet; hook=Listener catalog. | |
| type | No | For kind=setting: param type. toggle aliases trigger. | |
| label | No | For kind=setting: human-readable UI label. | |
| options | No | For kind=setting type=select: option ids. | |
| trigger | No | For kind=hook: event or lifecycle moment, e.g. 'player start', 'app ready', 'card full'. | |
| component | No | For kind=setting: Settings section id. Defaults to key prefix before '_'. | |
| description | No | For kind=plugin: one-sentence description of what the plugin does. | |
| plugin_kind | No | For kind=plugin: screen (default) | player | context-menu | settings-only. | |
| plugin_name | No | For kind=plugin: snake_case folder/id, e.g. 'my_feature'. | |
| default_value | No | For kind=setting: default value. |
Output Schema
| Name | Required | Description |
|---|---|---|
| markdown | Yes | Human-readable markdown report. Always present, including empty-result cases. Does not write files. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already mark the tool as read-only and idempotent, the description adds valuable behavioral detail: it returns markdown only, errors on missing required combinations, and offers best-matching hook selection. These are operational traits an agent needs that annotations do not fully convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured, front-loading the safety-critical fact that it does not write files before explaining each kind. Every sentence carries actionable information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists and annotations cover safety, the description completes the picture by specifying required parameter combos, error behavior, and the recommended follow-up validation step. An agent can correctly invoke this tool across all three kinds without further clarification.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds crucial grouping semantics by kind, required parameter combinations, and the toggle/trigger alias. It explains that plugin_kind applies only to kind=plugin, which is not clear from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear statement that the tool returns markdown and does not write the repository, then defines the three distinct kinds of scaffold output. It explicitly distinguishes itself from draft_patch, so an agent can tell which tool produces text versus patches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit per-kind guidance: which parameters are required, when plugin_kind applies, and that validate_code should be used as a follow-up. It also states when this tool is not appropriate by naming draft_patch, making the decision boundaries clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_codeSearch Lampa source contentsARead-onlyIdempotent
Search Lampa source contents for a literal or regex and return path:line plus a preview. Use this when you know a symbol or pattern; do not use it to list files by name (find_files), dump catalogs (list_catalog), or read one known path (read_source).
Defaults: literal, case-sensitive match (regex=true compiles RegExp exactly as written — no implicit i); extensions .js/.ts/.css/.scss/.html/.json unless globs is set — an empty globs array is treated the same as omitting it, not as 'no extensions'.
prefix narrows which folder is walked and globs still filters extensions within it — the two combine rather than override each other.
Limits: 100 hits total, 5 per file, 200-char preview per line (fixed, to keep results small enough for one call); invalid regex → error naming the bad pattern; no matches → empty markdown, not an error.
| Name | Required | Description | Default |
|---|---|---|---|
| globs | No | Extension globs to restrict search, e.g. ['*.js','*.ts']. When omitted, searches .js/.ts/.css/.scss/.html/.json. | |
| query | Yes | Literal substring (default, case-sensitive) or regex when regex=true. | |
| regex | No | If true, compile query as a JS RegExp with no extra flags (no implicit case-insensitive). Default false (literal). | |
| prefix | No | Repo-relative folder to walk, e.g. 'src' or 'plugins/iptv'. Combines with globs (prefix walks, globs filter extensions). |
Output Schema
| Name | Required | Description |
|---|---|---|
| markdown | Yes | Human-readable markdown report. Always present, including empty-result cases. Does not write files. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive and closed-world, so the safety profile is covered structurally. The description adds genuinely useful disclosure beyond that — default match mode, case-sensitivity, extension defaults, empty-globs equivalence, prefix+globs interaction, hard limits (100 hits, 5/file, 200-char preview), and the invalid-regex / no-match behaviors. Those limits and edge-case semantics are real added value, though return shape is mostly delegated to the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and sibling routing before defaults/limits, and each sentence carries distinct information. It is dense but not padded; the backtick-heavy prose is slightly harder to scan than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, yet the description still characterizes the hit format (path:line plus preview) and truncation size. Combined with defaults, limits, and failure modes, an agent has everything needed to call it correctly and interpret the result bounds.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description goes beyond it on two points the schema does not state plainly: an empty `globs` array is treated as omitted rather than 'no extensions', and `prefix` and `globs` combine rather than override. The regex wording largely restates the schema's own note about no implicit `i`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search contents) and resource (Lampa source), and explicitly distinguishes itself from three siblings — find_files, list_catalog, read_source — by naming what each of those does instead. An agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit positive trigger ('when you know a symbol or pattern') and three explicit exclusions with the correct alternative named for each. Nothing about tool selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
summarize_repoSummarize Lampa repo layoutARead-onlyIdempotent
Summarize the Lampa snapshot — commit metadata, top-level folders, plugins, entrypoints, and npm scripts — for first-session orientation. Returns a single markdown report (see output schema), not JSON. Do not use it to read bytes (read_source), search contents (search_code), or list files by name (find_files). Omit subfolder for the compact overview; subfolder='src/components' adds a recursive JS/TS-only listing under that prefix, matched case-sensitively against the snapshot's real path casing (an empty result is a valid 'no JS/TS files here' answer, not an error) on top of the same overview; unknown folder or missing repo → error; stdio needs LAMPA_REPO_PATH and Worker PAT is transport-only (no extra scopes or rate limits beyond GitHub's).
| Name | Required | Description | Default |
|---|---|---|---|
| subfolder | No | Repo-relative prefix whose JS/TS files to list recursively, e.g. 'src/components'. Omit for the compact overview. Unknown folder → error. |
Output Schema
| Name | Required | Description |
|---|---|---|
| markdown | Yes | Human-readable markdown report. Always present, including empty-result cases. Does not write files. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only and idempotent annotations, the description discloses that the result is a single markdown report rather than JSON, that `subfolder` triggers a recursive JS/TS-only listing, that matching is case-sensitive, and that an empty result is a valid answer rather than an error. It also covers error cases and transport/auth constraints that the annotations do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and return format are front-loaded, and every clause carries useful information. The description is dense and semicolon-heavy, which slightly reduces readability, but it does not waste space on redundant or irrelevant details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, return format, parameter behavior, error cases, and auth/transport constraints. With a rich output schema and annotations already present, this is complete enough for an agent to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds substantial meaning beyond the schema: omitting `subfolder` produces the compact overview, while supplying it adds a recursive JS/TS-only listing under a case-sensitive path prefix. It also clarifies that unknown folders or missing repos produce errors and that empty results are valid.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: "Summarize the Lampa snapshot," and enumerates the exact contents: commit metadata, top-level folders, plugins, entrypoints, and npm scripts. It clearly distinguishes the tool from `read_source`, `search_code`, and `find_files`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the intended use case as "first-session orientation" and explicitly lists when not to use it, naming the sibling tools for reading bytes, searching contents, and listing files. It also explains how to choose between the compact overview and the `subfolder` listing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trace_symbolTrace one Lampa symbol through codeARead-onlyIdempotent
Follow one event, component, file, or provider through the snapshot graph — not a full catalog (list_catalog) and not raw grep (search_code). Returns a markdown report (see output schema); large result sets are truncated with an explicit count, never silently paginated. Examples: mode=event target='app'; lifecycle target='src/components/full.js'; deps a file path; upgrade a repo-relative file path (not an API name); omit target only for api_calls (optional target is a provider keyword). Missing target otherwise → error; unknown event → markdown note (not a crash); deps reverse-refs cap at 20.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | event=Listener bus; lifecycle=component contract; deps=import blast radius; api_calls=external fetches; upgrade=scan a file for 2.x→Maker APIs. | |
| target | No | Required except api_calls. event: name e.g. 'app'/'player'; lifecycle: component name or path e.g. 'src/components/full.js'; deps/upgrade: repo-relative file path; api_calls: optional provider keyword. |
Output Schema
| Name | Required | Description |
|---|---|---|
| markdown | Yes | Human-readable markdown report. Always present, including empty-result cases. Does not write files. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, closed-world; the description adds behavior they don't cover: truncation with an explicit count and no silent pagination, missing-target → error, unknown event → markdown note rather than a crash, and a 20-item cap on deps reverse refs. That is exactly the failure-mode context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the scope and the sibling disambiguation, then mode examples and behavioral caveats — no sentence is filler. It is densely parenthetical, though, and the clipped example fragments take a second read, costing a point on structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values needn't be described, and the description correctly points at it while covering the things the schema can't: truncation, error vs. soft-note behavior, and per-mode targeting. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the enum and target rules are largely already documented; the description still adds value by pairing each mode with a concrete example target and clarifying that `upgrade` expects a repo-relative path rather than an API name. It mostly mirrors the schema, hence 4 rather than 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and object ('Follow one event, component, file, or provider through the snapshot graph') and explicitly names the two siblings it is not: `list_catalog` (full catalog) and `search_code` (raw grep). An agent can distinguish it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives per-mode usage examples (event/lifecycle/deps/upgrade/api_calls), states the exclusion 'omit target only for api_calls', and warns that `upgrade` takes a file path 'not an API name'. When-to-use and when-not-to-use are both covered, plus routing to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_codeValidate Lampa plugin, grep, i18n, or buildARead-onlyIdempotent
Run checks and hints, not catalogs (list_catalog) and not edit plans (plan_change); prefer analyze_plugin for a descriptive report and trace_symbol for dependency graphs — this tool only scores/lints/hints, it never describes structure.
mode=plugin scores a plugin against official pitfalls (target required); grep scans the snapshot for TODOs/console.log/undefined/lang/hardcoded HTML (not a shell, no code execution); i18n looks up key or, if omitted, coverage vs en.js; build returns the npm/gulp command for a goal as text — it never runs it.
Example: mode=grep checks=['todos','console_logs']; mode=i18n key='player_playlist' or omit key for a full coverage table.
checks only applies to mode=grep (default: all five checks); show_missing only applies to i18n coverage and is ignored once key is set; goal only applies to mode=build; target is required only for mode=plugin (folder or JS path) — missing plugin → error listing folders, missing target for mode=plugin → error naming the requirement.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | For mode=i18n: specific translation key. Omit for coverage report. | |
| goal | No | For mode=build: which command to hint (does not execute). Default build. | |
| mode | Yes | plugin=convention score; grep=snapshot quality scans (not a shell); i18n=keys/coverage; build=command hint (does not run npm/gulp). | |
| checks | No | For mode=grep: which checks. Defaults to all. | |
| target | No | Required for mode=plugin: plugin folder name or repo-relative JS path. Missing plugin → error listing folders. | |
| show_missing | No | For mode=i18n coverage: include missing/extra key lists. Default true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| markdown | Yes | Human-readable markdown report. Always present, including empty-result cases. Does not write files. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds genuinely new behavior: no shell and no code execution in `grep`, `build` never runs npm/gulp, and specific error semantics (missing plugin lists folders; missing `target` errors naming the requirement). These are exactly the side-effect and failure details annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is front-loaded with purpose and sibling routing before mode details, and every clause carries information. However the em-dash run-ons and stacked parentheticals make some sentences dense enough to require re-reading.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, annotations covering the safety profile, and 100% schema coverage, the description supplies the remaining missing layer: mode selection, parameter conditionality, and error behavior. Nothing an agent needs to invoke any of the four modes correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes beyond per-field docs by stating cross-parameter conditionality: `checks` applies only to grep (default all five), `show_missing` only to i18n coverage and is ignored once `key` is set, `goal` only to build, `target` required only for plugin. That conditional logic is not derivable from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource ("Run checks and hints") and explicitly negates the two most confusable siblings (`list_catalog`, `plan_change`) while naming the better alternatives `analyze_plugin` and `trace_symbol`. An agent can pick this tool over any sibling without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use for each of the four modes (`plugin` scores pitfalls, `grep` scans snapshot, `i18n` looks up key/coverage, `build` returns a command) plus explicit when-not-to-use by routing descriptive/graph work to `analyze_plugin` and `trace_symbol`. Two concrete invocation examples are supplied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v1.9.0- Added
guide_external_api - Added
guide_plugin_catalog
13 tool updates
v1.8.0- Added
analyze_plugin - Removed
cub_guide - Added
explain_docs - Removed
explain_lampa - Added
guide_cub - Added
list_catalog - Removed
map_lampa - Removed
plugin_deep_dive - Removed
repo_overview - Changed
search_code1 field changed- changed
Input schema / properties / prefix / descriptionPrevious value: -"Repo-relative folder to walk, e.g. 'src' or 'plugins/iptv'. Preferred over globs when the area is known."New value: +"Repo-relative folder to walk, e.g. 'src' or 'plugins/iptv'. Combines with globs (prefix walks, globs filter extensions)."
- Added
summarize_repo - Removed
trace_lampa - Added
trace_symbol
8 tool updates
v1.7.0- Changed
draft_patch2 fields changed- changed
Input schema / properties / plan_context / descriptionPrevious value: -"Paste the output of plan_change here for best results."New value: +"Optional paste of plan_change output. Recommended; the tool still runs without it." - changed
Input schema / properties / target_files / descriptionPrevious value: -"Files to focus on (repo-relative paths). Inferred from request if omitted."New value: +"Repo-relative files to patch. If omitted, up to 5 files are inferred from request (weaker than plan_context)."
- Changed
find_files3 fields changed- changed
Input schema / properties / ext / descriptionPrevious value: -"For mode=name only: extension filter, e.g. '.js' or '.scss'."New value: +"For mode=name only: extension filter, e.g. '.js' or '.scss'. Ignored otherwise." - changed
Input schema / properties / mode / descriptionPrevious value: -"name (default)=filename; feature=Lampa feature map; ui=templates/components; styles=css/scss; tests=spec files."New value: +"name (default)=filename substring; feature=built-in Lampa feature map + filename; ui=templates/components (+ up to 20 content hits); styles=css/scss (+ up to 15 content hits); tests=spec files." - changed
Input schema / properties / query / descriptionPrevious value: -"Filename substring, feature name, UI component, style module, or spec keyword depending on mode."New value: +"Filename substring (mode=name), feature name (mode=feature, e.g. player/catalog/iptv), UI component, style module, or spec keyword."
- Changed
map_lampa1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"Optional filter: API module, storage key, component name, flag keyword, or folder (for network)."New value: +"Filter the chosen catalog only (not a repo-wide search): API module, storage key, component name, flag keyword, or folder (for network)."
- Changed
repo_overview1 field changed- changed
Input schema / properties / subfolder / descriptionPrevious value: -"Optional repo-relative folder whose JS/TS modules to list, e.g. 'src/components'. Omit for overview only."New value: +"Repo-relative prefix whose JS/TS files to list recursively, e.g. 'src/components'. Omit for the compact overview. Unknown folder → error."
- Changed
resolve_edit_path1 field changed- changed
Input schema / properties / name / descriptionPrevious value: -"Optional name, e.g. plugin id 'tracks' or lang code 'en'."New value: +"Optional plugin id (e.g. 'tracks') or lang code (e.g. 'en'). Unknown values still return the kind's default paths."
- Changed
search_code4 fields changed- changed
Input schema / properties / globs / descriptionPrevious value: -"File glob patterns to restrict search, e.g. ['*.js','*.ts']."New value: +"Extension globs to restrict search, e.g. ['*.js','*.ts']. When omitted, searches .js/.ts/.css/.scss/.html/.json." - changed
Input schema / properties / prefix / descriptionPrevious value: -"Repo-relative folder to search within, e.g. 'src' or 'plugins/iptv'."New value: +"Repo-relative folder to walk, e.g. 'src' or 'plugins/iptv'. Preferred over globs when the area is known." - changed
Input schema / properties / query / descriptionPrevious value: -"Text or regex to search for in file contents."New value: +"Literal substring (default, case-sensitive) or regex when regex=true." - changed
Input schema / properties / regex / descriptionPrevious value: -"Treat query as a regex. Default false (literal)."New value: +"If true, compile query as a JS RegExp with no extra flags (no implicit case-insensitive). Default false (literal)."
- Changed
trace_lampa2 fields changed- changed
Input schema / properties / mode / descriptionPrevious value: -"event=Listener bus; lifecycle=component contract; deps=import blast radius; api_calls=external fetches; upgrade=2.x→Maker."New value: +"event=Listener bus; lifecycle=component contract; deps=import blast radius; api_calls=external fetches; upgrade=scan a file for 2.x→Maker APIs." - changed
Input schema / properties / target / descriptionPrevious value: -"Event name, component name/path, file path, or provider keyword depending on mode. Required except api_calls."New value: +"Required except api_calls. event: name e.g. 'app'/'player'; lifecycle: component name or path e.g. 'src/components/full.js'; deps/upgrade: repo-relative file path; api_calls: optional provider keyword."
- Changed
validate_code3 fields changed- changed
Input schema / properties / goal / descriptionPrevious value: -"For mode=build: which command to hint. Default build."New value: +"For mode=build: which command to hint (does not execute). Default build." - changed
Input schema / properties / mode / descriptionPrevious value: -"plugin=convention score; grep=quality scans; i18n=keys/coverage; build=command hint."New value: +"plugin=convention score; grep=snapshot quality scans (not a shell); i18n=keys/coverage; build=command hint (does not run npm/gulp)." - changed
Input schema / properties / target / descriptionPrevious value: -"For mode=plugin: plugin folder or repo-relative JS path."New value: +"Required for mode=plugin: plugin folder name or repo-relative JS path. Missing plugin → error listing folders."
50 tool updates
v1.6.0- Removed
add_setting - Removed
component_lifecycle - Added
cub_guide - Removed
doc_lookup - Changed
draft_patch4 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / plan_context / descriptionPrevious value: -"Paste the output of plan_feature_change here for best results."New value: +"Paste the output of plan_change here for best results." - changed
Input schema / properties / target_files / descriptionPrevious value: -"Files to focus on (repo-relative paths)."New value: +"Files to focus on (repo-relative paths). Inferred from request if omitted." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "properties": { + "markdown": { + "description": "Human-readable markdown report. Always present, including empty-result cases. Does not write files.", + "type": "string" + } + }, + "required": [ + "markdown" + ], + "type": "object" +}
- Added
explain_lampa - Removed
explain_lampa_pattern - Removed
extract_template_html - Removed
find_api_calls - Removed
find_feature - Changed
find_files7 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / ext / descriptionPrevious value: -"File extension filter, e.g. '.js', '.scss'."New value: +"For mode=name only: extension filter, e.g. '.js' or '.scss'." - added
Input schema / properties / modeAdded value: +{ + "description": "name (default)=filename; feature=Lampa feature map; ui=templates/components; styles=css/scss; tests=spec files.", + "enum": [ + "name", + "feature", + "ui", + "styles", + "tests" + ], + "type": "string" +} - removed
Input schema / properties / patternRemoved value: -{ - "description": "Substring or glob pattern to match against file names.", - "type": "string" -} - added
Input schema / properties / queryAdded value: +{ + "description": "Filename substring, feature name, UI component, style module, or spec keyword depending on mode.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "pattern" -]New value: +[ + "query" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "properties": { + "markdown": { + "description": "Human-readable markdown report. Always present, including empty-result cases. Does not write files.", + "type": "string" + } + }, + "required": [ + "markdown" + ], + "type": "object" +}
- Removed
find_settings - Removed
find_styles_for_module - Removed
find_translation_keys - Removed
find_ui_component - Removed
generate_plugin_boilerplate - Removed
get_core_module - Removed
get_network_map - Removed
get_storage_schema - Removed
impact_analysis - Removed
insert_hook - Removed
lampa_api_surface - Removed
list_all_events - Removed
list_modules - Removed
list_related_tests - Removed
list_scripts - Removed
list_streaming_providers - Removed
list_templates - Added
map_lampa - Removed
module_dependency_map - Added
plan_change - Removed
plan_feature_change - Changed
plugin_deep_dive4 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / plugin / descriptionPrevious value: -"Plugin folder name inside plugins/, e.g. 'online', 'iptv', 'collections', 'shots', 'online_prestige', 'dlna'."New value: +"Plugin folder inside plugins/, e.g. 'online', 'iptv', 'collections'. Omit for load-path only." - removed
Input schema / requiredRemoved value: -[ - "plugin" -] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "properties": { + "markdown": { + "description": "Human-readable markdown report. Always present, including empty-result cases. Does not write files.", + "type": "string" + } + }, + "required": [ + "markdown" + ], + "type": "object" +}
- Removed
read_file - Removed
read_file_segment - Added
read_source - Changed
repo_overview3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / properties / subfolderAdded value: +{ + "description": "Optional repo-relative folder whose JS/TS modules to list, e.g. 'src/components'. Omit for overview only.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "properties": { + "markdown": { + "description": "Human-readable markdown report. Always present, including empty-result cases. Does not write files.", + "type": "string" + } + }, + "required": [ + "markdown" + ], + "type": "object" +}
- Added
resolve_edit_path - Removed
risk_scan - Removed
run_build_hint - Removed
run_grep_checks - Added
scaffold_plugin - Removed
scaffold_plugin_integration - Changed
search_code5 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / properties / prefixAdded value: +{ + "description": "Repo-relative folder to search within, e.g. 'src' or 'plugins/iptv'.", + "type": "string" +} - changed
Input schema / properties / query / descriptionPrevious value: -"Text or regex to search for."New value: +"Text or regex to search for in file contents." - changed
Input schema / properties / regex / descriptionPrevious value: -"Treat query as a regex. Default false."New value: +"Treat query as a regex. Default false (literal)." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "properties": { + "markdown": { + "description": "Human-readable markdown report. Always present, including empty-result cases. Does not write files.", + "type": "string" + } + }, + "required": [ + "markdown" + ], + "type": "object" +}
- Removed
suggest_edit_targets - Removed
trace_event - Added
trace_lampa - Removed
translation_coverage - Added
validate_code - Removed
validate_plugin
41 tool updates
v1.0.0- First observed
add_setting - First observed
component_lifecycle - First observed
doc_lookup - First observed
draft_patch - First observed
explain_lampa_pattern - First observed
extract_template_html - First observed
find_api_calls - First observed
find_feature - First observed
find_files - First observed
find_settings - First observed
find_styles_for_module - First observed
find_translation_keys - First observed
find_ui_component - First observed
generate_plugin_boilerplate - First observed
get_core_module - First observed
get_network_map - First observed
get_storage_schema - First observed
impact_analysis - First observed
insert_hook - First observed
lampa_api_surface - First observed
list_all_events - First observed
list_modules - First observed
list_related_tests - First observed
list_scripts - First observed
list_streaming_providers - First observed
list_templates - First observed
module_dependency_map - First observed
plan_feature_change - First observed
plugin_deep_dive - First observed
read_file - First observed
read_file_segment - First observed
repo_overview - First observed
risk_scan - First observed
run_build_hint - First observed
run_grep_checks - First observed
scaffold_plugin_integration - First observed
search_code - First observed
suggest_edit_targets - First observed
trace_event - First observed
translation_coverage - First observed
validate_plugin
TDQS
Scored across 16 tools
Most tools have clearly distinct purposes, and the descriptions aggressively call out non-use cases (e.g. search_code vs find_files vs read_source). However, the numerous documentation/catalog tools — list_catalog, explain_docs, guide_cub, guide_external_api, guide_plugin_catalog — overlap conceptually enough that an agent must read carefully to choose correctly.
All tool names are snake_case and follow a predictable verb_noun or guide_noun pattern. There is no mixing of camelCase, inconsistent verb styles, or vague standalone names.
At 16 tools, the server is just over the typical well-scoped range and feels somewhat heavy. The count is partly justified by broad coverage, but several guide/catalog tools could likely be consolidated without losing capability.
The surface covers orientation, search, file inspection, plugin scaffolding, analysis, planning, patch drafting, validation, and documentation/guides. It is nearly complete for a read-only Lampa developer assistant, though it intentionally does not apply edits or write files, leaving that as a manual follow-up.
Maintenance
Related MCP Connectors
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
The Remote MCP server acts as a standardized bridge between LLM applications (like Claude, ChatGPT, and Cursor) and external services, enabling AI agents to access external tools and resources. Its primary capability is providing a centralized search tool to discover other MCP servers and their respective tools. Unlike local implementations, it runs remotely with OAuth authentication and permission controls for security.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server providing 29 tools across 5 layers for semantic TypeScript/JavaScript code intelligence, enabling AI agents to find references, trace impacts, guard APIs, and explain errors without text-search false positives.4 npm1MIT
- AlicenseNot gradedqualityAmaintenanceMCP server for local-first code intelligence, providing structural code graph, semantic search, and impact analysis to AI agents.2MIT
- AlicenseNot gradedqualityBmaintenanceA production-ready MCP server that enables AI assistants to intelligently understand, analyze, edit, navigate, and review software projects with multi-workspace support, Git integration, and semantic search.1MIT
- AlicenseNot gradedqualityCmaintenanceMCP server that analyzes codebases to provide dependency graphs, impact analysis, and file insights across 15+ programming languages, enabling AI assistants to understand project structure and navigate code efficiently.MIT