ellmos-controlcenter-mcp
OfficialThe ellmos ControlCenter MCP server is a local MCP control plane for discovering, inspecting, managing, and auditing MCP stacks, profiles, tools, skills, and plugins. Key capabilities include:
Status & Language: Check overall MCP stack health, get and set the output language (
de,en,es,zh,ja,ru).Discovery & Inventory: Scan local MCP repositories and list found servers; build a JSON catalog of all discovered servers with optional live tool probes and bundle assignments.
Stack Management: List registered stacks from the catalog, describe their typed components, policies, and validation warnings; generate compact context packs at
short,execution, orfulldetail levels.Tool Probing: Start local or profile-defined servers and retrieve their real
list_toolsoutput via the MCP protocol.Capability Bundles: Group probed tools into bundles (e.g., core-local, software, automation); list bundles, recommend bundles for a task, and assign tools to bundles based on metadata matching.
Profile Management: List, resolve (including inheritance chains), recommend, switch, and audit Claude profiles. Audits flag
npxstarts, environment variable secrets, missing commands, and sensitive argument fragments.Skills & Plugins: Inventory deployed skills, find skills by keywords via lexical matching, and list installed plugins and local ellmos modules.
Dashboard: An optional local web dashboard for visual management of servers, profiles, audits, and tool scans.
Click on "Install 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., "@ellmos-controlcenter-mcplist my local MCP servers"
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.
ellmos ControlCenter MCP
Part of the ellmos-ai family.
LLM / AI Agent Integration: This repository provides an llms.txt index file for context optimization, RAG discovery, and agent navigation.
Quick Navigation
Quick Start • System Architecture • Control & Gateway Flow • Tools (34) • Gateway • Security Policy • llms.txt Context • Ecosystem Matrix
An alpha-stage Model Context Protocol (MCP) administration server for local MCP stacks. ControlCenter discovers local MCP servers, reads MCP profile files, groups servers into capability bundles, recommends profiles for a task, builds catalogs, probes real MCP tool lists from local repositories or profiles, assigns tools to capability bundles, and provides an optional local dashboard.
What "control" means here — read this before you rely on it. ControlCenter is a read-mostly administration surface. It reads, inventories, resolves, audits, and generates configuration. Its only write actions are generating an MCP config file (
controlcenter_switch_profile) and writing a catalog (controlcenter_build_catalog); the dashboard can additionally toggle servers in a profile file, with confirmation and backup.It does not change a running session, does not sit in the request path, does not proxy or execute another server's tools, and does not enforce any permission. In the ellmos taxonomy it is a control plane in the narrow sense — it administers MCP servers, profiles, and stacks without owning domain data — not a gateway.
Provider note: ControlCenter works with any MCP-capable client (Claude Code, Codex, Gemini, or any stdio-based MCP host). The profile management tools default to Claude Code's profile directory (
~/.claude/profiles) but accept any directory viaELLMOS_PROFILE_ROOT. The skill and plugin inventory tools are scoped to Claude Code conventions by default; see the environment variables below for override options.
The first alpha release focuses on discovery, profile visibility, dashboard workflows, capability bundles, profile-aware tool-list probes, tool-bundle assignments, internationalization, and initial policy audits. Since 0.5.0 a gateway is added on top: controlcenter_list_available_tools and controlcenter_invoke reach MCP servers the host has not loaded, under a pattern-based policy and an audit log — see Gateway. Authentication, risk-class enforcement, and hard security boundaries are still planned, not implemented.
Alpha note: This version is useful for local administration and preview testing. It is not a hardened MCP gateway and should not be used as a security layer for untrusted tools or other users.
System Architecture
graph TD
A["Clients (Claude Code, Codex, Gemini, stdio Hosts)"] -->|MCP stdio / JSON-RPC| B["ellmos ControlCenter MCP Server"]
subgraph Core ["Control Plane Modules"]
B --> C["Catalog Scanner (catalog.ts)"]
B --> D["Profile Resolver (profiles.ts)"]
B --> E["Bundle Manager (bundles.ts)"]
B --> F["Tool Prober (toolCatalog.ts)"]
B --> G["Policy Auditor (policy.ts)"]
B --> H["Context Packer (contextPack.ts)"]
B --> I["i18n Engine (src/i18n)"]
end
subgraph Storage ["Local System & Environment"]
C -->|Scans| S1["Local Repos (C:\_Local_DEV\repos)"]
D -->|Reads / Resolves| S2["Claude Profiles (~/.claude/profiles)"]
E -->|Loads & Maps| S3["Capability Bundles (data/capability-bundles.json)"]
F -->|stdio Probes| S4["Local & Profile MCP Servers"]
G -->|Audits| S5["Policy Rules & Security Risks"]
end
subgraph UI ["Management Interface"]
B <-->|HTTP / WebSocket (127.0.0.1:3737)| J["Local Dashboard (dashboard.ts)"]
endRelated MCP server: MCP Manager
Control Plane & Gateway Lifecycle
sequenceDiagram
autonumber
actor Agent as MCP Client (Claude / Codex / Gemini)
participant CC as ControlCenter MCP Server
participant Res as Profile & Capability Resolver
participant Gate as Gateway Policy Guard
participant Backend as Backend MCP Server (Unloaded)
participant Scrub as Hardening & Secret Scrubber
participant Audit as Audit Logger (JSONL)
Note over Agent,CC: 1. Administration & Profile Discovery
Agent->>CC: controlcenter_suggest_profile / resolve_profile
CC->>Res: Inspect ~/.claude/profiles & extends chains
Res-->>CC: Resolved MCP Configuration & Bundles
CC-->>Agent: Suggested Profile & --mcp-config flags
Note over Agent,CC: 2. Policy-Gated Gateway Execution
Agent->>CC: controlcenter_invoke(server, tool, args)
CC->>Gate: Evaluate data/gateway-policy.json
alt Policy Denied or Missing
Gate-->>CC: Policy Refusal (Fail-Closed)
CC->>Audit: Log refusal (names only, 0 values)
CC-->>Agent: Error: Tool / Server denied by policy
else Policy Allowed
Gate-->>CC: Dispatch Approved
CC->>Backend: Connect-per-call (stdio / Streamable HTTP)
Backend-->>CC: Raw Tool Output / Response
CC->>Backend: Terminate process / Close transport
CC->>Scrub: Recursive Secret Redaction & Finite Budgets
Scrub-->>CC: Sanitized Payload & Truncation Status
CC->>Audit: Append structured audit event (gateway-audit.jsonl)
CC-->>Agent: Safe Tool Result wrapped with Data Banners
endStatus
Phase: Alpha
Version:
0.7.0Repository:
ellmos-ai/ellmos-controlcenter-mcpCI checks:
npm run testandnpm run buildGoal: Make local MCP stacks visible, inspectable, and reproducibly configurable
Focus: Catalogs, profile overview, profile recommendation, bundle recommendation, profile-aware tool-list probes, tool-bundle assignments, i18n, early audits, and read-only host governance metadata
Tools
Tool | Purpose |
| Show stack, profile, and detected-server status |
| Run a native self |
| Show the current ControlCenter output language |
| Set the ControlCenter output language for this running server instance |
| Scan local MCP repositories below the MCP root and enrich them with kind and state ownership from |
| Describe one MCP server from |
| Read registered stacks from |
| Describe typed components, roles, policies, and validation warnings for one registered stack |
| Build a bounded, manifest-only handoff for a registered stack at |
| Start local or profile-defined MCP servers and read their real |
| Rank typed native-binding claims from a hash-consistent System Explorer resolution without selecting or executing one |
| Show resolution-bound component claims while keeping declared and runtime-state axes separate |
| Assign probed MCP tools to capability bundles |
| Group local servers by capability bundle |
| Recommend bundles for a task |
| List MCP profiles from the profile root (defaults to |
| Recommend a profile for a task |
| Resolve a profile including |
| Prepare a generated |
| Run initial policy checks against a profile |
| Build a JSON catalog of local MCP servers, optionally including tool probes |
| Inventory deployed skills ( |
| Match keywords for a task or intent against the scanned skill catalogue and return ranked candidates — see Querying skill search |
| Validate an LLM/user-selected role, expert and persona against a provider-neutral map and verify endpoints against the live skill inventory |
| Inventory installed plugins ( |
| List active |
| Check whether one path is locked, including locks inherited from parent directories |
| Report what the nearest |
| List pending user decisions by identifier, date, title and status |
| Federate allowlisted decision, policy, strategic-plan and BYUM metadata read-only; report each source separately and never adopt or execute a candidate |
| List rows from the host's resource inventory (systems and/or installed software) — read-only mirror; the register's authority sits with the ControlRoom programme, not here |
| Full row detail for one resource by its inventory id, from the same read-only mirror |
| List the tools of MCP servers this host has not loaded, without loading them — see Gateway |
| Run one tool on a server this host has not loaded and return its result, policy-gated and audited |
Gateway: reaching servers the host has not loaded
A session that loads eleven MCP servers pays for all of their tools at once. The gateway lets the loaded profile stay small — for example FileCommander, ControlCenter, open-compute — while the remaining servers stay reachable on demand.
// what is out there, without loading it
{ "name": "controlcenter_list_available_tools", "arguments": { "profile": "full" } }
// run one of those tools; no prior listing required when the name is known
{ "name": "controlcenter_invoke", "arguments": {
"server": "ellmos-clatcher-mcp", "tool": "fix_umlauts",
"args": { "path": "C:/tmp/notes.md" } } }Scope. Only servers declared by the configured MCP root (ELLMOS_MCP_ROOT) or by the profile
named in profile can be addressed. That set is the gateway's primary boundary — there is no way
to point it at an arbitrary command.
Lifecycle. The connection is opened for the call and closed afterwards. No backend process is kept running between invocations. The cost is roughly 200–500 ms per call on a cold stdio server; the benefit is that ControlCenter never leaves child processes behind.
Failure modes are kept apart. Four different things can go wrong, and they mean different things:
Outcome | Meaning |
| The name is not in the addressable set. The known names are returned. |
| The server exists but could not be asked. Not "returned nothing". |
| The server has no such tool. Its available tool names are returned, so a wrong guess self-corrects in one step. |
| The call arrived and the target reported a tool error. This is a backend result, not a ControlCenter failure. |
A listing over several servers states at the top when some of them could not be asked, so a partial result is never mistaken for a complete one.
Policy. data/gateway-policy.json (override with ELLMOS_GATEWAY_POLICY):
{
"schema": "ellmos.controlcenter.gateway-policy.v1",
"mode": "open",
"deny": [{ "server": "*", "tool": "*_delete_*", "reason": "Deletion stays manual." }],
"allow": []
}mode: "open" allows every tool of an addressable server; mode: "allowlist" requires a matching
allow rule. deny always wins, and * is a wildcard in both fields. A malformed or
schema-foreign policy file refuses every invocation rather than falling back to allow-all.
Audit. Every invocation, including refused ones, is appended as one JSON line to
~/.ellmos/controlcenter/gateway-audit.jsonl (ELLMOS_GATEWAY_AUDIT_LOG; set it to off to
disable). The entry holds argument names and count — never argument values — plus the masked
connection command or URL, outcome, duration and content-block count, never result content. The
tool output reports whether the write succeeded, so a failed audit is visible; set
ELLMOS_GATEWAY_AUDIT_REQUIRED=1 to turn a failed write into a refused call.
Hardening. Forwarded payloads are foreign data, so the invoke path is bounded on every axis:
Control | Behaviour |
Recursive redaction | Narrow credential shapes ( |
Request budget | Oversized arguments are refused, never shortened; a truncated argument set would silently change the request. |
Response budget | Oversized answers are truncated and flagged, so the part that arrived stays usable. |
Nesting and blocks |
|
Concurrency |
|
Transport | HTTPS only; plain HTTP allowed on loopback alone. Redirects refused. Narrow further with |
Untrusted marking | Forwarded content is fenced with a banner marking it as data, not instructions — the gateway pipes third-party output into an agent's context. |
Not included. Connection pooling, streaming and progress pass-through, sampling, elicitation, backend resources and prompts, and risk-class policies derived from tool annotations. Opaque session-bound capabilities have no counterpart yet, because no session is held and no capability handle is issued. Only the MCP adapter exists; module, stack and folder adapters remain open.
Catalog discovery
ControlCenter reads three hand-curated catalogs instead of hard-coding individual paths. Each root is configurable, and each catalog is optional.
Catalog | Schema | Root (env override) | Used by |
|
|
|
|
|
|
|
|
|
|
|
|
The MCP catalog contributes what a directory scan cannot see: mcp_kind (tool, adapter, stack, control-plane), whether a server keeps persistent state, and which component owns that state per namespace. The directory scan stays the source for what is actually installed, so both directions are reported: a scanned server without a catalog entry keeps empty catalog fields, and a catalog entry without a directory is listed separately rather than dropped. Entries are joined on the catalog id first and on the npm package name second, because a server may publish under a different name than its directory.
A missing, unreadable, or foreign-schema catalog never fails a tool call. The enriched fields degrade to empty and the output names the reason, so an absent catalog is distinguishable from a server that genuinely holds no state. An unreadable MCP root is likewise reported as unreadable instead of as an empty result.
Host registers: locks, permissions, decisions, governance, resources
The seven tools above answer a different question from the rest of this server: not "what can I configure?" but "what applies on this machine right now?" They read six host-local registers — project locks, an agent-neutral permission register, a pending decision list, a policy registry, the strategic-plan index, and a resource inventory of systems and installed software.
controlcenter_list_governance composes the generated decision index, the existing
ellmos.plans-register/1 strategic-plan index, and an explicitly configured
ellmos.policy-registry.v1 file. The policy registry is validated only through the canonical
PolicyRegistry.load() API. Every source reports available, unconfigured, unreadable, or
invalid; partial data never claims completeness, and a valid registry with zero BYUM candidates
reports an honest zero. Plan paths, notes and host variants remain in _PLANS; BYUM rows remain
pending advisory pointers without adoption or execution authority.
controlcenter_list_resources and controlcenter_describe_resource are a read-only mirror
of .SYNC/_inventory/inventory.db. Register authority sits with the ControlRoom programme's
own resources.inventory resolver role, not with this server — this mirror can go stale
between syncs and never claims otherwise.
They are read-only. No lock is created, renewed or released; no decision is answered.
LOCK.user.* locks in particular are removed by the user alone, and nothing here can touch
them.
They fail closed. If a register is unconfigured, a path is unreadable, the interpreter is
missing or a check errors, the verdict is unknown and safe to proceed is no — never a
reassuring "clear". A lock checker that guesses in the reassuring direction is more dangerous
than none at all.
Inheritance is respected. A LOCK.txt in a parent directory locks everything beneath it,
so controlcenter_check_lock walks the whole ancestor chain and reports the effective lock
with its distance, not just a file sitting in the same folder.
Lock semantics are not reimplemented here. A small bridge script delegates every rule —
expiry, protected lock types, scope parsing, permission precedence deny > ask > allow > default
— to the host's canonical Python modules. A second implementation would drift from the spec on
the next change to it. This is the one place where the server calls Python; if no interpreter is
available the tools fail closed like any other unmet precondition.
Configuration
These tools are inert until configured, because these registers do not exist on a machine that has not set them up:
Variable | Purpose |
| Directory holding the canonical |
| Optional path to |
| Directory holding the decision chain and its generated index. Required by |
| Path to the resource inventory SQLite file ( |
| Explicit path to an |
| Optional source root containing the canonical |
| Explicit path to |
| Interpreter to run the bridge with. Defaults to |
What these tools deliberately do not return
controlcenter_list_decisions returns identifiers, dates, titles, status and scope — not the
question texts, options or recommendations, which can describe personal circumstances. Read
those in the register itself.
controlcenter_list_governance uses fixed field allowlists. It never returns source URIs or plan
paths, host variants, plan notes, questions, options, recommendations, rationale, prompts, full
text, reasons, secure/avatar content, action payloads, execution payloads, or receipts, and it
never dereferences a registry pointer.
Cost of a full scan
controlcenter_list_locks walks every configured root. Over cloud-synced storage that takes
minutes, so the scan runs under a wall-clock budget, checked between roots. If the budget runs
out, the result is marked incomplete and names the roots that were never reached — an
incomplete scan proves nothing about them. For a single path, controlcenter_check_lock is the
right tool and answers in milliseconds.
Querying skill search
controlcenter_find_skill matches purely lexically over name, aliases, tags, category and
description. It does not yet do semantic/embedding search, so query with keywords and
technical terms, not with whole sentences. A natural-language sentence drags in filler words,
and those can outrank the correct hit.
Resolution-bound capability search
controlcenter_find_capability and controlcenter_tool_overview consume an explicit
system-explorer.resolution.v1 file. They fail closed unless its content hash is self-consistent and
its component-registry source-verification claim is present. That claim is not external provenance:
until System Explorer emits a separately trusted receipt, output fields explicitly report
provenance_verified: false and identity_verified: false. Only stable, type-consistent native-binding
claims are returned. Results use
the method controlcenter-lexical-candidate and score domain controlcenter.lexical.v1; they never
select a provider, prove identity or availability, or authorize execution. Semantic routing remains a separate
advisory producer.
Query | Top result | |
❌ |
|
|
✅ |
|
|
Two consequences:
Scores are only comparable within a single query. In the example above the wrong hit scored higher than the right one in a different query. Never treat the number as a confidence measure.
If the caller is an LLM, translate the user's phrasing into keywords first. That step is cheap and turns the weakest case into the strongest one.
Until semantic search is supported (tracked in TODO.md), keyword queries are the intended usage —
not a workaround.
Semantic role and skill routing
controlcenter_resolve_semantic_route keeps semantic role selection with the caller LLM or the
user, validates the selected coordinator/expert/persona edges against a
semantic-persona-routing.map.v1 file, and checks explicit skill endpoints against the current
skill inventory. The default map is ~/.ellmos/controlcenter/routing/semantic-persona-routing-map.v1.json
and can be overridden with ELLMOS_SEMANTIC_ROUTING_MAP or a tool input.
Lexical candidates remain separately labelled. A routing-map candidate can become a verified endpoint only after the caller explicitly confirms it as a second semantic/source signal and the skill is uniquely present in the deployed live inventory. Nested map records, stable IDs, enums, references, and uniqueness are validated fail-closed. The route grants no tool or execution authority.
Dashboard
After building the project, start the local dashboard with:
npm run dashboardDefault address:
http://127.0.0.1:3737The dashboard can currently show local servers and profiles, switch its UI language, enable or disable servers per profile, summarize profile audits, scan MCP tools for the selected profile or local repositories, display tool-to-bundle assignments, and write a generated --mcp-config file. Write actions ask for confirmation and create a backup before overwriting an existing file.
Discovery and Registry Metadata
ControlCenter ships MCP registry metadata for crawlers and catalog tools:
server.jsonuses the official MCP server metadata shape with the package name, repository, and stdio transport.llms.txtgives LLM crawlers a compact project summary, canonical links, and tool overview.package.jsonincludes both files in the npm package so registry indexers can read the same metadata from GitHub or npm.
The public npm package is the canonical install target. The GitHub repository remains the canonical source for development, issues, and release notes.
Search and Discovery Context
Use the full name ellmos ControlCenter MCP or the package name ellmos-controlcenter-mcp when linking or searching. The short phrase "control center" is too broad, and "ellmos" can collide with Elmo/ELMO motion-control, HR, and voice-generator results.
Best-fit search phrases:
ellmos ControlCenter MCPellmos-controlcenter-mcpMCP control plane for local serversMCP profile management dashboardlocal MCP stack discovery TypeScriptClaude Codex Gemini MCP profile switcherMCP policy audit profile management
Installation
Option 1: Install from npm
npm install -g ellmos-controlcenter-mcpStart the MCP server:
ellmos-controlcenterStart the dashboard:
ellmos-controlcenter-dashboardOption 2: Install from source
git clone https://github.com/ellmos-ai/ellmos-controlcenter-mcp.git
cd ellmos-controlcenter-mcp
npm install
npm run buildRun the server from source:
node dist/index.jsRun the dashboard from source:
node dist/dashboard.jsConfiguration
MCP Client Configuration
ControlCenter works with any MCP-capable client. The JSON snippet below uses the standard mcpServers format supported by Claude Code, Claude Desktop, Codex, Cursor, and other MCP hosts.
If installed globally from npm:
{
"mcpServers": {
"controlcenter": {
"command": "ellmos-controlcenter"
}
}
}If installed from source:
{
"mcpServers": {
"controlcenter": {
"command": "node",
"args": [
"/absolute/path/to/ellmos-controlcenter-mcp/dist/index.js"
]
}
}
}Optional environment variables:
ELLMOS_MCP_ROOToverrides the default MCP repository rootELLMOS_STACKS_ROOToverrides the stack catalog root (default: local.AI/.STACKS)ELLMOS_MCP_CATALOGoverrides the MCP catalog file (default:mcps.catalog.v1.jsoninside the MCP root)ELLMOS_MODULES_ROOToverrides the module catalog root (default: local.AI/.MODULES)ELLMOS_PROFILE_ROOToverrides the profile directory (default:~/.claude/profiles)ELLMOS_SKILLS_ROOToverrides the deployed skills directory (default:~/.claude/skills)ELLMOS_PLUGINS_ROOToverrides the plugins directory (default:~/.claude/plugins)ELLMOS_BUNDLE_CONFIGoverrides the capability bundle definition fileELLMOS_POLICY_CONFIGoverrides the profile audit policy rule fileELLMOS_LAUNCH_TEMPLATEoverrides the generated profile-switch launch command. Use{config}as placeholder for the generated MCP config path.ELLMOS_CONTROLCENTER_ACTUAL_SELF_CONFIGpoints to the host-local, fail-closed actual-self producer configuration. If it is absent,controlcenter_actual_self_receiptemits no receipt.CONTROLCENTER_LANGUAGEorELLMOS_CONTROLCENTER_LANGUAGEsets the initial output language
Signed actual-self receipts
controlcenter_actual_self_receipt is an optional evidence producer for System Explorer. It starts a fixed child instance of this package, reads only its MCP list_tools surface, hashes a redacted tool summary, and returns an Ed25519-signed ellmos.actual-self-component-receipt.v1. It never executes a reported tool and never returns the signing key, configuration path, environment, raw descriptions, or local paths.
The host-local JSON configuration must use ellmos.controlcenter.actual-self-producer.v1 and contain exactly enabled, scope, registry_binding, signer_id, private_key_path, private_key_sha256, and ttl_seconds in addition to schema. TTL is limited to 300 seconds. The configured host must match the native hostname and the private key must match its lowercase SHA-256 pin. Trust-store provisioning and route activation are deliberately external operations; producing a receipt does not make it trusted.
By default, the MCP repository root is derived from the OneDrive/ONEDRIVE environment variable and falls back to ~/OneDrive/.TOPICS/.AI/.MCP.
Internationalization
ControlCenter supports the language codes de, en, es, zh, ja, and ru. All six languages now have maintained text sets for MCP tool output, dashboard labels, policy hints, profile recommendations, and tool descriptions.
Use controlcenter_get_language to inspect the current language and controlcenter_set_language to switch MCP tool output at runtime. The dashboard also includes a language selector and accepts /?lang=en style links. Bundle titles and descriptions loaded from custom JSON config files are shown as authored.
Profile Switching
controlcenter_switch_profile does not change a running session. It creates a resolved MCP configuration and returns a launch command. The default remains compatible with Claude Code:
claude --mcp-config ~/.claude/profiles/_generated/software.mcp.jsonWith write: false, the switch runs as a preview. With write: true, ControlCenter writes the generated file. The generated mcpServers JSON is readable by any MCP-capable client. Use the launchTemplate input or ELLMOS_LAUNCH_TEMPLATE to return a Codex, Gemini, or custom launcher command, for example codex mcp run --config {config}.
A planned optional restart/reconnect workflow will keep this boundary: after a written profile change, ControlCenter should surface a restart hint and copyable launch command for Claude Code, while automatic reconnection stays behind an explicit, client-specific adapter and must fail closed when unsupported.
Profile resolution supports single inheritance ("extends": "base"), multiple inheritance ("extends": ["base", "shared"]), and inherited-server removal via "remove", "disabled", or "disabledServers". Missing profiles, invalid JSON, invalid profile names, and inheritance cycles now return explicit profile errors with the affected file path or chain.
Capability Bundles
ControlCenter loads capability bundle definitions from data/capability-bundles.json. The default file groups local servers into these bundles:
core-localsoftwarefilesystemautomationcontrol-plane
Custom bundle files can be supplied with ELLMOS_BUNDLE_CONFIG or with the optional bundleConfigPath input on bundle tools. A bundle file is a JSON object with schemaVersion and a bundles array. Each bundle needs id, title, description, and keywords.
This is the basis for future tool-bloat management: instead of exposing many individual tools immediately, an agent can first choose the capability bundle that fits the task.
Tool Catalog
controlcenter_list_tools can start local stdio MCP servers or resolved Claude profile servers and call the standard MCP list_tools request. Profile scans support arbitrary stdio commands, including non-Node launchers, and URL-based remote configs using Streamable HTTP or legacy SSE. The scan is explicit, uses a per-server timeout, does not call any reported tool, and closes each spawned local server after reading the tool list.
controlcenter_build_catalog accepts includeTools: true to persist the same probe results alongside the local server catalog.
controlcenter_assign_tool_bundles compares probed tool names, titles, descriptions, server names, source, and transport metadata with capability-bundle keywords, then reports which tools belong to bundles such as filesystem, software, automation, or control plane.
Profile Audit
controlcenter_audit_profile is the first small policy layer. It currently flags:
npxstartsenvironment variables in server configurations
missing or invalid server commands
sensitive name fragments in arguments
Environment values are never printed.
Policy rules are loaded from data/policy-rules.json by default. The file can disable individual rules or override their severity, and controlcenter_audit_profile also accepts a policyConfigPath input for one-off audits.
Project Structure
ellmos-controlcenter-mcp/
|-- src/
|-- test/
|-- data/
|-- README.md
|-- README_de.md
|-- START.md
|-- ARCHITECTURE.md
|-- STATE.md
|-- DECISIONS.md
`-- TODO.mdDocumentation
For... | Read... |
Quick start | |
Current state | |
Architecture | |
Roadmap | |
Decisions | |
Open tasks | |
Changes | |
LLM crawler summary |
ellmos-ai Ecosystem
This MCP server is part of the ellmos-ai ecosystem — AI infrastructure, MCP servers, and intelligent tools.
MCP Server Family
Server | Tools | Focus | npm |
47 | Filesystem, process management, interactive sessions, cloud-lock-safe operations | ||
22 | Code analysis, JSON repair, imports, diffs, regex | ||
12 | File repair, format conversion, batch operations | ||
19 | n8n workflow management via AI assistants | ||
34 | MCP stack, tool and skill discovery; profile resolution and audit; read-only host lock, permission, decision, policy, plan and resource registers | ||
45 | Local-first LLM memory, knowledge, state, routing, swarm orchestration |
| |
8 | Server operations: health checks, log analysis, deploy dry-runs, mail diagnostics |
| |
3 | Headless Blender asset QA and FBX reimport verification |
| |
10 | Model-agnostic computer use: capture, safety-gated actions, Windows UIA |
|
AI Infrastructure
Project | Description |
Local-first text-based OS for LLM agents — 113+ handlers, 550+ tools, SQLite memory | |
Local-first lifecycle hooks, scope guardrails & runtime provenance | |
Model-agnostic computer-use core powering Open Compute MCP | |
Provider-neutral LLM orchestration with auto-routing and budget tracking | |
Lightweight agent memory, connectors, and automation infrastructure | |
Self-hosted AI research stack (Ollama + n8n + Rinnsal + KnowledgeDigest) | |
Autonomous agent chain framework for Claude Code | |
Minimalist database-driven LLM OS prototype (4 functions, 1 table) | |
Testing framework for LLM operating systems (7 dimensions) |
Open-Science & Research
Project | Ecosystem | Focus |
| Open-science user mental model reconstruction & cognitive framework |
Desktop Software & Companion Tools
Our partner organization open-bricks bundles AI-native desktop applications — a modern, open-source software suite built for the age of AI.
Project | Ecosystem | Focus |
| Advanced file management, checksums, duplicate detection, and batch operations | |
| Local-first multi-agent project locking and permission governance | |
| Document management, text extraction, OCR, and PDF processing | |
| Universal document grabbing, batch ingestion, OCR & text normalization | |
| Local-first runtime guard and environment validator for AI coding agents | |
| Multi-agent coordination and background automation engine | |
| Developer productivity center and workspace manager | |
| Sandboxed script execution and multi-language scratchpad | |
| System gap discovery, test gap analysis & contract validation |
License
MIT - Lukas Geiger (ellmos-ai)
Bundles and partners
ControlCenter MCP remains a standalone, published MCP server. In the V4
composition it is an optional MCP access surface of the
ellmos-core-discovery-bundle: it exposes local MCP-stack, profile, tool and
skill discovery to people and MCP-capable clients. It is not the functional
owner of policies, decisions, memory, automations, system maps, or the modules
behind the discovered tools.
Configured component registries, local MCP servers, profile files and skill
libraries are discovery partners, not bundled ownership transfers. The
published ControlCenter identity and package name remain unchanged.
ControlRoom is a separate planned operator stack, not a rename or a hidden
replacement for this server.
Authoritative bundle membership, versions, profiles and any private composition recipes remain in the corresponding bundle manifests. This public section is discovery-only.
Available Tools
20 toolscontrolcenter_assign_tool_bundlesTools Capability-Bundles zuordnenBRead-onlyIdempotent
Ordnet echte MCP-Tools anhand ihrer Metadaten den ControlCenter-Capability-Bundles zu.
| Name | Required | Description | Default |
|---|---|---|---|
| mcpRoot | No | Optionaler MCP-Root. Standard ist der lokale ellmos-MCP-Ordner. | |
| timeoutMs | No | Timeout pro MCP-Tool-Scan in Millisekunden. Standard: 5000. | |
| serverName | No | Optionaler Servername für einen gezielten Scan. | |
| profileName | No | Optionaler Profilname. Wenn gesetzt, werden die aufgelösten Server dieses Claude-Profils gescannt. | |
| profileRoot | No | Optionaler Profilordner. Standard ist ~/.claude/profiles. | |
| bundleConfigPath | No | Optionaler Pfad zu einer Capability-Bundle-Konfiguration. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose readOnlyHint=true, idempotentHint=true, and destructiveHint=false, which cover the safety profile. The description adds that assignment is based on metadata but does not clarify whether the result is persisted or just returned, leaving mild ambiguity. It does not contradict 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 a single, focused sentence that is front-loaded with the action and subject. Every word earns its place, with no redundancy or 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?
While the schema covers parameters and annotations cover safety, the description does not mention what the tool returns (no output schema) or how the optional parameters like profileName or mcpRoot alter the assignment. For a tool with 6 optional parameters, a bit more context about the outcome would improve completeness, but the core functionality is still understandable.
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?
All 6 parameters have descriptions in the schema, so the description adds no additional parameter-level meaning. Since schema description coverage is 100%, the description does not need to compensate; a baseline of 3 is appropriate.
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 clearly states the action ('ordnet zu' / assigns) and the resource (MCP tools to capability bundles). It is specific enough to distinguish from 'suggest_bundles' by using 'assign' rather than 'suggest', though it doesn't explicitly address the difference.
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?
No guidance is provided on when to use this tool versus alternatives like 'suggest_bundles' or 'list_bundles'. The description solely states the function without context, exclusions, or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
controlcenter_audit_profileClaude-Profil auditierenARead-onlyIdempotent
Prüft ein aufgelöstes Claude-Profil auf erste Policy-Hinweise wie npx-Starts, Env-Secrets und ungültige Server-Konfigurationen.
| Name | Required | Description | Default |
|---|---|---|---|
| profileName | Yes | Profilname ohne .json, zum Beispiel software oder ai-lab. | |
| profileRoot | No | Optionaler Profilordner. Standard ist ~/.claude/profiles. | |
| policyConfigPath | No | Optionaler Pfad zu einer Policy-Regel-Konfiguration. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive, and the description does not contradict them. It adds value by specifying the exact categories of policy hints checked (npx starts, env secrets, invalid server configurations), giving the agent concrete expectations about the tool's behavior.
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 a single, focused sentence that conveys the tool's purpose and scope without any extraneous information. It front-loads the verb and resource, making it effective for quick scanning.
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 tool is a simple read-only audit with one required parameter; the description covers the purpose and key check categories. However, with no output schema, it does not explicitly state the return format, though the mention of 'Policy-Hinweise' gives a hint that the result is a list of findings. Overall, it is sufficient for the tool's complexity.
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 input schema already provides detailed descriptions for all three parameters, including examples and default values, with 100% coverage. The tool description does not add further parameter semantics beyond the schema, so a baseline score of 3 is appropriate.
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 the specific verb 'Prüft' (audits) with the resource 'aufgelöstes Claude-Profil' and enumerates what it checks: npx starts, env secrets, invalid server configurations. This clearly distinguishes it from sibling tools like resolve_profile or list_profiles, which have different operations.
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 implies a prerequisite by saying 'aufgelöstes Claude-Profil' (resolved profile), suggesting the user should resolve the profile first, but it does not explicitly state when to use this tool versus alternatives. There is no mention of exclusions or other ways to audit, but the context of a policy audit is clear enough for an implied usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
controlcenter_build_catalogLokalen Server-Katalog bauenCIdempotent
Erzeugt einen JSON-Katalog der lokal gefundenen MCP-Server.
| Name | Required | Description | Default |
|---|---|---|---|
| mcpRoot | No | Optionaler MCP-Root. Standard ist der lokale ellmos-MCP-Ordner. | |
| timeoutMs | No | Timeout pro MCP-Tool-Scan in Millisekunden. Standard: 5000. | |
| outputPath | No | Optionaler Ausgabeort für den JSON-Katalog. | |
| profileName | No | Optionaler Profilname. Wenn gesetzt, werden die aufgelösten Server dieses Claude-Profils gescannt. | |
| profileRoot | No | Optionaler Profilordner. Standard ist ~/.claude/profiles. | |
| includeTools | No | Wenn true, werden lokale MCP-Server gestartet und echte list_tools-Ergebnisse in den Katalog aufgenommen. | |
| bundleConfigPath | No | Optionaler Pfad zu einer Capability-Bundle-Konfiguration. | |
| includeToolAssignments | No | Wenn true, werden Tool-Bundle-Zuordnungen für gescannte Tools in den Katalog aufgenommen. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations state readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=false. The description only says 'creates a catalog', which aligns with these annotations but adds no additional behavioral context such as side effects (e.g., starting local MCP servers when includeTools=true), file writes, or potential resource usage. The description does not contradict annotations but also does not go beyond them.
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 extremely concise—one sentence with no filler or redundancy. It effectively front-loads the core purpose. However, given the tool's complexity (8 parameters, no output schema), this level of brevity sacrifices necessary context, though that is more of a completeness issue than a conciseness issue. It earns a 4 for efficient wording.
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 tool has 8 parameters, no output schema, and non-trivial behavior (e.g., starting servers, writing files). The description only provides a high-level statement of output, leaving the agent without understanding of return values, side effects, or when to invoke it. The schema covers parameter details, but the description fails to tie them together or explain the overall workflow, making it incomplete for an AI agent.
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 input schema has 100% description coverage across all 8 parameters, so the schema already explains each parameter's meaning. The tool description adds no parameter-level semantics; it doesn't mention any parameters or their roles. With such high schema coverage, a baseline score of 3 is appropriate.
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 clearly states the verb 'Erzeugt' (creates) and the resource 'JSON-Katalog der lokal gefundenen MCP-Server'. It identifies the tool's purpose as generating a catalog, which is distinct from siblings like controlcenter_list_local_servers. However, it doesn't explicitly differentiate itself from that sibling or other related tools, so it misses the highest level of clarity.
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 provides no guidance on when to use this tool versus alternatives, no context about prerequisites, and no exclusions. It is a single declarative sentence without any usage direction. The schema hints at profile-based scanning and tool inclusion, but the description itself gives no decision support.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
controlcenter_context_packStack-Kontextpaket erstellenARead-onlyIdempotent
Erstellt ein kompaktes, rein lesendes Kontextpaket aus einem registrierten Stack-Manifest. Es führt keine Komponenten aus und liest weder Geheimnisse noch Live-Zustände.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | Umfang des Kontextpakets: short, execution oder full. | short |
| stackId | Yes | Stabile Stack-ID aus stacks.catalog.json. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the annotations by disclosing that it 'führt keine Komponenten aus und liest weder Geheimnisse noch Live-Zustände.' This adds critical behavioral context not present in the readOnlyHint or idempotentHint annotations, fully aligning with and enriching them.
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 sentences, front-loads the main purpose, and every clause adds value (purpose, read-only nature, exclusions). It is concise without unnecessary elaboration.
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 low-complexity tool with two well-documented params and strong annotations, the description sufficiently covers purpose, safety profile, and behavioral exclusions. It does not describe return format, but the term 'Kontextpaket' and the level parameter (in schema) provide reasonable context, making it adequately complete.
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 100% of parameters with descriptions, so the baseline is 3. The description does not add parameter-specific details, but it clarifies the stack manifest source for stackId, which is consistent with schema. No additional semantic value is provided beyond 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?
The description clearly states a specific action ('Erstellt ein kompaktes, rein lesendes Kontextpaket') with a specific resource ('aus einem registrierten Stack-Manifest'). It differentiates from sibling tools by emphasizing read-only behavior and non-execution, making the tool's function unambiguous.
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 implies the tool is for safe, read-only context retrieval without executing components, which suggests when to use it. However, it does not explicitly name alternative tools (e.g., controlcenter_describe_stack) or provide exclusion criteria, leaving usage context somewhat vague.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
controlcenter_describe_stackRegistrierten Stack beschreibenARead-onlyIdempotent
Zeigt typisierte Komponenten, Pflichtrollen, Policies und Validierungswarnungen für einen registrierten Stack.
| Name | Required | Description | Default |
|---|---|---|---|
| stackId | Yes | Stabile Stack-ID aus stacks.catalog.json. | |
| stacksRoot | No | Optionaler Pfad zum Ordner mit stacks.catalog.json. Standard ist der lokale .AI/.STACKS-Ordner. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds that the tool returns validation warnings, which gives a hint about the output and potential failure modes, but it does not go into depth about error handling or prerequisites beyond 'registrierten Stack'.
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 a single, front-loaded sentence that enumerates the output categories without any redundant words or 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?
For a read-only describe tool with a simple parameter set and no output schema, the description adequately explains what the tool returns by listing four output categories. It covers the essential purpose and output, though it omits any edge-case behavior or extended details about how to use stacksRoot.
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?
Both parameters have full descriptions in the schema (100% coverage), and the tool description does not add any additional parameter meaning. The description implies stackId refers to a registered stack, but that is already in the schema description. Therefore, it does not exceed the schema baseline.
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 the verb 'Zeigt' and specifies the exact content (typisierte Komponenten, Pflichtrollen, Policies, Validierungswarnungen) for a registered stack, making the action and resource clear. It does not explicitly differentiate from sibling tools like list_stacks, but the describe-versus-list distinction is evident.
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?
No explicit when-to-use or alternative guidance is provided. The context is implied from the tool's purpose: an agent would use it to get detailed stack information, but there is no exclusionary language or comparative reference to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
controlcenter_find_skillPassende Skills findenARead-onlyIdempotent
Erkennt, welche Skills zu einer Aufgabe bzw. einem Intent passen. WICHTIG: mit Stichwörtern/Fachbegriffen abfragen, nicht mit ganzen Sätzen — die Suche ist rein lexikalisch, ganze Sätze werden (noch) nicht semantisch verstanden und ziehen über Füllwörter Fehltreffer an. Bewertet den gescannten Skill-Katalog lexikalisch über Name, Aliases, Tags, Kategorie und Beschreibung und gibt die besten Kandidaten mit den getroffenen Begriffen zurück. Scores sind nur innerhalb einer Abfrage vergleichbar, nicht zwischen Abfragen.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximale Anzahl gerankter Skill-Kandidaten. Standard: 5. | |
| intent | Yes | Stichwörter/Fachbegriffe zur Aufgabe, gegen die der Skill-Katalog gematcht wird (z. B. "Bug debuggen Testfehler" statt "mein Programm stürzt beim Speichern ab"). Ganze Sätze werden noch nicht semantisch ausgewertet; Füllwörter führen dann zu Fehltreffern. | |
| skillsRoot | No | Optionaler Pfad zum deployte Skills-Ordner. Standard ist ~/.claude/skills. | |
| deployedOnly | No | Wenn true, werden nur deployte Skills zurückgegeben und die Quell-Skill-Bibliothek nicht gescannt. | |
| sourceSkillsRoot | No | Optionaler Pfad zum Quell-Skill-Bibliotheks-Root. Standard ist der lokale .AI/.SKILLS/skills-Ordner. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description reveals important behavioral traits: the search is lexical (not semantic), the catalog is scanned across specific fields (name, aliases, tags, category, description), and scores are only comparable within a single query. This adds significant context about the tool's internal workings and limitations.
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 efficiently structured in three sentences: purpose, critical usage warning, and supplementary details about scoring. Every sentence adds value, and the most important instruction (use keywords) is highlighted with 'WICHTIG' to draw attention. No redundant wording.
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 tool's moderate complexity (5 parameters, no output schema), the description adequately covers purpose, input query format, matching logic, and a caveat about score comparability. It briefly indicates the return includes best candidates with matched terms, but lacks detail on result structure (e.g., fields like score, name). This is a minor gap, not a critical omission.
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 input schema already provides 100% parameter descriptions, including the intent parameter's keyword guidance. The description reinforces the lexical matching behavior but does not add new semantic details about individual parameters beyond what the schema already specifies. Therefore, baseline 3 is appropriate.
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 clearly states the tool's purpose: recognizing which skills match a task or intent. It distinguishes itself from sibling tools like list_skills by emphasizing that it evaluates and ranks skill candidates based on lexical matching over name, aliases, tags, category, and description, rather than simply listing all skills.
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 provides concrete usage guidance: query with keywords/technical terms, not whole sentences, because the search is purely lexical and full sentences attract false hits. It gives context on how to formulate the intent parameter and warns about score comparability across queries, though it does not explicitly name alternative tools or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
controlcenter_get_languageControlCenter Sprache anzeigenARead-onlyIdempotent
Zeigt die aktuelle ControlCenter-Ausgabesprache und die unterstützten Sprachcodes.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description does not need to repeat safety traits. It adds useful context about the output content (current language and supported codes), but no additional behavioral details such as side effects, permissions, or rate limits.
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 a single concise sentence that is direct and front-loaded. Every word contributes meaning, with no redundant or extraneous information.
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 simple getter with no parameters and no output schema, the description adequately discloses what it returns (current output language and supported language codes). It is complete enough for an agent to understand the tool's functionality without further elaboration.
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 tool has no parameters, and schema coverage is 100% (vacuously). Per calibration, 0 parameters receives a baseline of 4. The description does not need to add parameter semantics since none exist.
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 'Zeigt die aktuelle ControlCenter-Ausgabesprache und die unterstützten Sprachcodes' uses a specific verb (zeigt/shows) and names the resource (ControlCenter output language). It clearly differentiates from sibling tool controlcenter_set_language, which presumably modifies the language.
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 states what the tool does but does not explicitly specify when to use it or how it differs from alternatives. The context of a read-only getter is implied but no exclusions or alternative tools are mentioned, leaving usage guidance implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
controlcenter_list_bundlesCapability-Bundles listenBRead-onlyIdempotent
Gruppiert lokale MCP-Server in Aufgaben-Bundles wie Software, Filesystem, Automation und Control Plane.
| Name | Required | Description | Default |
|---|---|---|---|
| mcpRoot | No | Optionaler MCP-Root. Standard ist der lokale ellmos-MCP-Ordner. | |
| bundleConfigPath | No | Optionaler Pfad zu einer Capability-Bundle-Konfiguration. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the conceptual context that bundles group local MCP servers into task categories, which helps interpret results, but it does not disclose mechanics like whether it scans the filesystem or depends on configuration paths.
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 a single concise sentence with no fluff, and it front-loads the key concept of grouping MCP servers. It loses a point because the verb choice is slightly inconsistent with the tool's listing function, which could confuse.
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?
There is no output schema, and the description does not specify what the tool returns (e.g., a list of bundle names, associated servers, or metadata). While the examples of bundle types give some orientation, the description is incomplete for a list operation without output schema or usage 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 description coverage is 100% for the two optional parameters (mcpRoot, bundleConfigPath), so the schema already documents them. The description adds no extra meaning or usage details about these parameters, maintaining the baseline.
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 names the resource (capability bundles) and gives concrete examples (Software, Filesystem, Automation, Control Plane), which distinguishes it from sibling list tools. However, the verb 'gruppiert' (groups) does not directly say 'list' or 'shows', so the operation is implied rather than explicitly stated.
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?
No guidance is provided on when to use this tool versus alternatives like list_stacks or list_profiles. There is no mention of prerequisites, context, or exclusion criteria, leaving the agent to infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
controlcenter_list_local_serversLokale MCP-Server listenARead-onlyIdempotent
Scannt den lokalen MCP-Root und listet gefundene MCP-Repos mit Metadaten auf.
| Name | Required | Description | Default |
|---|---|---|---|
| mcpRoot | No | Optionaler MCP-Root. Standard ist der lokale ellmos-MCP-Ordner. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, establishing a safe, non-destructive operation. The description adds behavioral context by stating it scans the local MCP root and lists found repos with metadata. No contradictions, but no additional side-effect or permission information is provided.
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 a single concise sentence that front-loads the action and result. It contains no wasted words and perfectly communicates the tool's purpose.
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 simple read-only listing tool with full schema coverage and appropriate annotations, the description is complete enough. It explains what is scanned, what is returned (repos with metadata), and the optionality of the root. No output schema exists, so the description does not need to detail return fields.
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 fully describes the single optional parameter mcpRoot, including its default value. The description does not add parameter-level detail beyond what is already in the schema, so the baseline of 3 applies.
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 specific verbs ('scans' and 'lists') with a clear resource (local MCP repos with metadata). It distinguishes from siblings which target stacks, tools, profiles, and plugins. No other sibling lists MCP servers, so the purpose is unambiguous.
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 clearly implies when to use this tool (when you need to discover local MCP servers). It does not explicitly name alternatives or exclusions, but since no sibling performs the same function, the context is sufficient. Score 4 because it lacks explicit '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.
controlcenter_list_pluginsPlugins und Module listenARead-onlyIdempotent
Inventarisiert installierte Claude Code Plugins und lokale ellmos-Module mit ihren Fähigkeiten.
| Name | Required | Description | Default |
|---|---|---|---|
| modulesOnly | No | Wenn true, werden nur lokale Module zurückgegeben und Claude Code Plugins nicht gescannt. | |
| modulesRoot | No | Optionaler Pfad zum ellmos-Module-Ordner. Standard ist der lokale .AI/.MODULES-Ordner. | |
| pluginsOnly | No | Wenn true, werden nur Claude Code Plugins zurückgegeben und lokale Module nicht gescannt. | |
| pluginsRoot | No | Optionaler Pfad zum Claude Code Plugins-Ordner. Standard ist ~/.claude/plugins. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description does not need to restate safety. It adds the detail that the tool inventories capabilities, which is a minor addition beyond annotations. No contradictions detected.
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 a single, front-loaded sentence with no redundant words. Every phrase adds meaning, making it very concise and well-structured.
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 simple listing tool with full parameter schema and strong annotations, the description provides sufficient context. It could explicitly mention that both plugins and modules are returned by default, but the schema defaults make that inferable.
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%, with all four parameters well-documented in the input schema. The description itself adds no parameter-level detail, but the schema carries the full burden, so the baseline of 3 is appropriate.
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 the specific verb 'Inventarisiert' and clearly identifies the resource: installed Claude Code plugins and local ellmos modules with their capabilities. This distinguishes it from sibling listing tools like list_skills or list_tools.
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 does not explicitly mention alternatives or when-not-to-use guidance. While the purpose implies use when an inventory of plugins/modules is needed, it lacks explicit exclusions or comparisons to sibling tools, leaving usage somewhat implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
controlcenter_list_profilesClaude-Profile listenARead-onlyIdempotent
Liest die lokalen Claude-Profile und zeigt Serveranzahl, Vererbung und Dateipfade.
| Name | Required | Description | Default |
|---|---|---|---|
| profileRoot | No | Optionaler Profilordner. Standard ist ~/.claude/profiles. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering safety. The description adds value by disclosing that the tool outputs server count, inheritance, and file paths, which tells the agent what to expect from the return value. No contradictions 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 a single concise sentence that front-loads the action and specifies the key output information without unnecessary words. It earns its place and is easy to parse.
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 tool is simple (1 optional param, read-only), annotations cover safety, and the description conveys the essential output. The schema documents the parameter default. It lacks explicit usage guidance, but that is more of a usage guideline issue. Overall, it is complete enough for an agent to invoke 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?
The single optional parameter profileRoot is fully documented in the schema with a description and default (~/.claude/profiles). Since schema description coverage is 100%, the baseline is 3, and the tool description adds no additional parameter 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 uses a clear verb ('liest' = reads) and resource ('lokalen Claude-Profile' = local Claude profiles), and it specifies what is shown (server count, inheritance, file paths). This distinguishes it from sibling tools like list_local_servers or list_stacks, which target different resources.
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 states what the tool does but gives no explicit guidance on when to use it versus alternatives like controlcenter_list_local_servers or controlcenter_list_stacks. Usage context is implied from the name and description, but no exclusions or alternative recommendations are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
controlcenter_list_skillsClaude Code Skills listenARead-onlyIdempotent
Inventarisiert installierte Claude Code Skills aus dem deployte Skills-Ordner und der Quell-Skill-Bibliothek.
| Name | Required | Description | Default |
|---|---|---|---|
| skillsRoot | No | Optionaler Pfad zum deployte Skills-Ordner. Standard ist ~/.claude/skills. | |
| deployedOnly | No | Wenn true, werden nur deployte Skills zurückgegeben und die Quell-Skill-Bibliothek nicht gescannt. | |
| sourceSkillsRoot | No | Optionaler Pfad zum Quell-Skill-Bibliotheks-Root. Standard ist der lokale .AI/.SKILLS/skills-Ordner. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds context about scanning both sources and the default behavior, but does not disclose details like recursion or output format. This is moderate value beyond 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 a single, front-loaded sentence with no wasted words. It directly states the action and scope, making it highly concise and well-structured.
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 simple read-only listing tool, the description is adequate: it identifies the two sources and the optional parameter behavior is handled by the schema. However, without an output schema, it does not mention what the return value looks like, which is a minor gap.
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 input schema covers all three parameters with descriptions (100% coverage), so the schema carries the parameter semantics. The description does not add further meaning beyond mentioning the two source directories, which is already reflected 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?
The description uses a specific verb 'Inventarisiert' (inventories) and clearly identifies the resource (Claude Code Skills) and scope (deployed folder and source library). This distinguishes it from sibling tools like list_tools and list_plugins.
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 implies usage for listing skills but does not explicitly state when to use this tool over alternatives such as find_skill or list_tools. No exclusions or alternative recommendations are provided, so guidance is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
controlcenter_list_stacksRegistrierte Stacks listenARead-onlyIdempotent
Liest den neutralen Stack-Katalog und seine ellmos.stack.v2-Manifeste, ohne Stack-Komponenten auszuführen.
| Name | Required | Description | Default |
|---|---|---|---|
| stacksRoot | No | Optionaler Pfad zum Ordner mit stacks.catalog.json. Standard ist der lokale .AI/.STACKS-Ordner. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive behavior. The description adds the meaningful detail that the tool reads the 'neutral' stack catalog and manifests without executing components, providing context beyond the safety 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 a single, concise sentence that front-loads the action and includes the important non-execution qualifier. No unnecessary words or repetition.
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 tool is simple with one optional parameter and a clear read-only purpose. The description adequately explains what is read and the non-executive behavior. Without an output schema, it could mention what is returned, but for a list operation this is largely implied.
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 only parameter, stacksRoot, is fully described in the JSON schema (100% coverage), so the description does not need to add parameter details. It adds no new parameter semantics, but the schema is sufficient.
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 clearly states the tool's function: it reads the stack catalog and its ellmos.stack.v2 manifests. It also explicitly notes that it does not execute stack components, distinguishing it from tools that might run or apply stacks.
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 implies the tool is for reading/listing stack metadata from the catalog, but it does not explicitly state when to prefer this over siblings like describe_stack or build_catalog. The 'without executing' caveat provides some usage context but no direct comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
controlcenter_list_toolsMCP-Tools listenARead-onlyIdempotent
Startet lokale oder profildefinierte MCP-Server kontrolliert und liest deren echte Tool-Liste per MCP list_tools aus.
| Name | Required | Description | Default |
|---|---|---|---|
| mcpRoot | No | Optionaler MCP-Root. Standard ist der lokale ellmos-MCP-Ordner. | |
| timeoutMs | No | Timeout pro Connect- und list_tools-Anfrage in Millisekunden. Standard: 5000. | |
| serverName | No | Optionaler Servername, Paketname, mcpName oder Profilservername für einen gezielten Scan. | |
| profileName | No | Optionaler Profilname. Wenn gesetzt, werden die aufgelösten Server dieses Claude-Profils gescannt. | |
| profileRoot | No | Optionaler Profilordner. Standard ist ~/.claude/profiles. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond annotations by disclosing that the tool actively starts servers, a behavioral side effect not captured by readOnlyHint or idempotentHint. It also clarifies that it retrieves the 'real' tool list, adding useful context about the operation's outcome.
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 a single, concise sentence that front-loads the primary action and result. No redundant or filler content exists, and every word contributes meaning.
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 explains what the tool does and what it returns (the tool list), which is sufficient given the annotations and full parameter documentation. It does not detail error behavior or pagination, but those are not essential for a read-only listing tool with optional parameters.
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 all five parameters have descriptions in the schema. The tool description does not add any extra parameter-level meaning beyond what the schema already provides, so the baseline of 3 applies.
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 clearly states the tool starts local or profile-defined MCP servers and reads their tool lists via MCP list_tools. This specific verb+resource combination distinguishes it from sibling tools like controlcenter_list_local_servers or controlcenter_list_stacks.
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 implies usage context (when you need to start servers and retrieve their actual tool lists) but does not explicitly mention when to use alternatives or any exclusions. Sibling tools exist for related but distinct purposes, yet no comparison or guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
controlcenter_resolve_profileClaude-Profil auflösenARead-onlyIdempotent
Löst ein Claude-Profil inklusive optionaler Vererbung auf und zeigt die resultierenden MCP-Server.
| Name | Required | Description | Default |
|---|---|---|---|
| profileName | Yes | Profilname ohne .json, zum Beispiel software oder ai-lab. | |
| profileRoot | No | Optionaler Profilordner. Standard ist ~/.claude/profiles. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only, idempotent, and non-destructive, reducing the burden. The description adds valuable context by explaining the resolution process (including optional inheritance) and what the output shows (resulting MCP servers). This provides behavioral insight beyond the annotations, though it does not mention potential errors or exact output format.
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 a single, well-structured sentence that is front-loaded with the action and includes the key outcome. It contains no redundancy or filler, and every word contributes to understanding the tool's function.
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 tool's simplicity (2 params, no output schema) and strong annotations, the description is sufficiently complete. It explains the core behavior and result ('shows resulting MCP servers'), which provides the necessary return-value context given the absence of an output schema. It does not elaborate on edge cases or inheritance rules, but that is not critical for this level of complexity.
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 input schema has 100% coverage with clear descriptions for both parameters: 'profileName' includes format and example, and 'profileRoot' explains optionality and default. The description does not add further parameter details beyond what the schema provides, so a baseline score of 3 is appropriate.
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 clearly states what the tool does: it resolves a Claude profile including optional inheritance and shows the resulting MCP servers. The verb 'Löst' (resolves) and the specific outcome ('zeigt die resultierenden MCP-Server') make the purpose unambiguous. It also distinguishes itself from siblings like switch_profile (which activates) or list_profiles (which lists) by focusing on resolution/inheritance.
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 implies usage context: use this when you need to resolve a profile and see the effective MCP servers after inheritance. However, it does not explicitly state when to use this over alternatives or provide exclusions. The sibling tools are listed, but the description itself offers no comparative guidance, so it remains at 'implied usage' rather than explicit recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
controlcenter_set_languageControlCenter Sprache setzenAIdempotent
Setzt die ControlCenter-Ausgabesprache für diese laufende MCP-Serverinstanz.
| Name | Required | Description | Default |
|---|---|---|---|
| language | Yes | Sprachcode für die ControlCenter-Ausgaben. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare idempotentHint=true and readOnlyHint=false; the description is consistent. It adds the key behavioral fact that the setting is scoped to the current instance, implying non-persistence. This goes beyond the 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?
Single sentence, front-loaded with the action, no redundant language. Every word earns its place.
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 simple setter with one parameter and strong annotations, the description is complete. It conveys the action, the scope, and the effect without needing to explain output (no output schema).
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 input schema already has 100% coverage with the parameter description 'Sprachcode für die ControlCenter-Ausgaben.' The tool description adds no additional parameter details, so baseline 3 applies.
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?
Clear verb+resource: 'Setzt die ControlCenter-Ausgabesprache' identifies exactly the action (set output language) and target. The scope 'für diese laufende MCP-Serverinstanz' adds specificity. It is distinct from the sibling getter controlcenter_get_language.
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 clear context: the change applies to the current running MCP server instance. It does not explicitly mention alternatives (like the getter tool), but the setter/getter distinction is obvious from the name. No exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
controlcenter_statusControlCenter StatusARead-onlyIdempotent
Zeigt einen Überblick über den lokalen MCP-Stack, lokale Server und Claude-Profile.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is known. The description adds the scope of the overview (local MCP stack, servers, profiles), which provides some context beyond annotations, but it does not describe the output format or whether the status is aggregated in a particular way.
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 a single, front-loaded sentence that is concise and free of any waste. It directly states the tool's purpose without redundancy or 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?
The tool is simple (no params, no output schema) and the description covers the main content areas (local MCP stack, local servers, Claude profiles). While a bit more detail about the output would improve completeness, the description is sufficient for a status-overview tool given the annotations and simplicity.
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 tool has zero parameters, and schema coverage is 100% (empty schema). Per the baseline, 0 parameters warrants a 4 since there is nothing for the description to add about parameter semantics. The description correctly does not invent any parameters.
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 clearly states the tool shows an overview of the local MCP stack, local servers, and Claude profiles, using the specific verb 'zeigt einen Überblick' (shows an overview). This distinguishes it from sibling tools that list individual components (e.g., controlcenter_list_stacks, controlcenter_list_local_servers) by emphasizing the aggregated status view.
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 implies usage for getting a high-level overview but provides no explicit guidance on when to use this tool versus the more specific list/describe sibling tools. No exclusions or alternatives are mentioned, only the general purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
controlcenter_suggest_bundlesCapability-Bundles empfehlenARead-onlyIdempotent
Empfiehlt passende Capability-Bundles für eine Aufgabenbeschreibung.
| Name | Required | Description | Default |
|---|---|---|---|
| task | Yes | Aufgabenbeschreibung oder Ziel der Session. | |
| mcpRoot | No | Optionaler MCP-Root. Standard ist der lokale ellmos-MCP-Ordner. | |
| bundleConfigPath | No | Optionaler Pfad zu einer Capability-Bundle-Konfiguration. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, providing a safety profile. However, the description adds no additional behavioral context—no mention of how recommendations are computed, what outputs look like, or any other operational details. It merely restates the tool's obvious purpose, offering minimal value beyond 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 a single, succinct sentence that immediately conveys the core function with no superfluous words or repetition. It is well-structured and easy to parse.
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 simple recommendation tool with no output schema, the description covers the basic intent but lacks details on return format, decision criteria, or failure scenarios (e.g., when no bundles match). It is minimally viable but not richly informative.
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%: all three parameters have meaningful descriptions in the input schema. The tool description offers no additional parameter insights, but since the schema is self-sufficient, baseline score of 3 is appropriate.
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 clearly states a specific function: 'Empfiehlt passende Capability-Bundles für eine Aufgabenbeschreibung' (recommends suitable capability bundles for a task description). Use of the verb 'empfiehlt' (recommends) and the target resource 'Capability-Bundles' distinguishes this from sibling tools like list_bundles (simple listing) or suggest_profile (profile suggestion).
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?
No explicit guidance is provided on when to use this tool versus alternatives such as list_bundles or assign_tool_bundles. The description implies usage for task descriptions, but does not were-when to use this over similar tools, leading to only implied usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
controlcenter_suggest_profileProfil empfehlenARead-onlyIdempotent
Empfiehlt ein Claude-Profil anhand der Aufgabenbeschreibung.
| Name | Required | Description | Default |
|---|---|---|---|
| task | Yes | Aufgabenbeschreibung oder Ziel der Session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, fully covering the safety profile. The description adds no extra behavioral details (e.g., return format or error handling), but it is consistent with the 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 a single, focused sentence that states the purpose and input criterion without any fluff. Every word earns its place.
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 simple one-parameter tool with strong annotations, the description is largely complete. It clearly defines the function and input, but does not explicitly state the return value (e.g., the recommended profile name), which would be slightly more helpful given no output schema.
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 provides 100% coverage with a clear description for the only parameter 'task' ('Aufgabenbeschreibung oder Ziel der Session'). The tool description does not add additional parameter semantics beyond what the schema already offers.
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 clearly states the action (recommends), the resource (Claude profile), and the input basis (task description). This distinguishes it from sibling tools such as switch_profile (which switches) and suggest_bundles (which recommends bundles, not profiles).
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 implies usage: when a task description is available and a profile recommendation is needed. It provides clear context but does not explicitly mention alternatives or when not to use this tool, though the sibling list makes the niche apparent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
controlcenter_switch_profileProfilwechsel vorbereitenAIdempotent
Bereitet einen Profilwechsel vor, indem ein aufgelöstes --mcp-config-File erzeugt oder als Vorschau angezeigt wird.
| Name | Required | Description | Default |
|---|---|---|---|
| write | No | Wenn true, wird die generierte Config geschrieben. Sonst nur Vorschau. | |
| outputPath | No | Optionaler Ausgabeort für die generierte MCP-Config. | |
| profileName | Yes | Profilname ohne .json, zum Beispiel software oder ai-lab. | |
| profileRoot | No | Optionaler Profilordner. Standard ist ~/.claude/profiles. | |
| launchTemplate | No | Optionales Startbefehl-Template. Nutze {config} als Platzhalter für den Pfad zur generierten MCP-Config. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate non-read-only, idempotent, non-destructive behavior. The description adds useful context: the tool can either write the config or show a preview depending on the `write` parameter, and it resolves a full mcp-config file. This goes beyond the raw annotations without contradicting them.
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 a single, information-dense sentence that front-loads the primary action ('Bereitet einen Profilwechsel vor') and then specifies the key artifact and modes (erzeugt oder als Vorschau). No wasted words.
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 rich input schema and annotations, the description is sufficient to infer the tool's main behavior. It does not explain return/output format for the preview mode, but this is less critical because no output schema is expected and the preview concept is reasonably transparent.
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?
All five parameters are fully described in the input schema (100% coverage), so the description does not need to compensate. The description's mention of a 'resolved --mcp-config file' reinforces the role of `profileName` and `profileRoot`, but it does not add much beyond 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?
The description clearly states the tool's purpose: preparing a profile switch by generating or previewing a resolved --mcp-config file. This distinguishes it from sibling tools like `controlcenter_resolve_profile`, though it does not explicitly name those alternatives.
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 implies the tool is used when preparing a profile switch, and the `write` flag makes the preview/write distinction clear. However, it does not explicitly contrast this tool with the many sibling profile-management tools, such as `suggest_profile` or `audit_profile`.
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. Dates show when Glama detected each change.
20 tool updates
v0.2.4- First observed
controlcenter_assign_tool_bundles - First observed
controlcenter_audit_profile - First observed
controlcenter_build_catalog - First observed
controlcenter_context_pack - First observed
controlcenter_describe_stack - First observed
controlcenter_find_skill - First observed
controlcenter_get_language - First observed
controlcenter_list_bundles - First observed
controlcenter_list_local_servers - First observed
controlcenter_list_plugins - First observed
controlcenter_list_profiles - First observed
controlcenter_list_skills - First observed
controlcenter_list_stacks - First observed
controlcenter_list_tools - First observed
controlcenter_resolve_profile - First observed
controlcenter_set_language - First observed
controlcenter_status - First observed
controlcenter_suggest_bundles - First observed
controlcenter_suggest_profile - First observed
controlcenter_switch_profile
TDQS
Every tool targets a distinct resource and action, from language settings to stack manifests, profiles, bundles, skills, and plugins. Even the list-type tools are clearly differentiated by their entity (servers, stacks, profiles, etc.), leaving no ambiguity.
All tool names follow the exact pattern 'controlcenter_verb_noun' using snake_case throughout. Verbs are precise and consistently used (list, get, set, describe, suggest, resolve, switch, audit), making the API highly predictable.
With 20 tools, the surface is on the heavy side, falling into the 16-25 range that feels borderline. While each tool targets a legitimate aspect of the broad ControlCenter domain, the sheer number may overwhelm agents initially.
The tool set covers a wide range of operations across language, local servers, stacks, bundles, profiles, skills, and plugins. Minor gaps exist such as no create/delete for stacks or profiles and no direct install/uninstall for plugins, but core workflows are well covered and not dead-ended.
Maintenance
Related MCP Connectors
MCP-first control plane for ProAgentStore agents and private instances.
MCP control plane for AI developers managing customer mail, DNS, projects, keys, and diagnostics.
Control plane for autonomous software labor. Agents claim objectives over MCP with audit trail.
The MCP server that vets MCP servers: identity, risk grade and per-tool risk before you install.
Related MCP Servers
- AlicenseDqualityDmaintenanceA unified control center for managing MCP servers, providing tooling for environment variable management, profile-based configurations, and local package installation automation.2417MIT
- AlicenseNot gradedqualityBmaintenanceSelf-hosted MCP proxy and aggregation platform. Register multiple upstream MCP servers and expose them through a single unified endpoint with namespace routing, multi-transport support (HTTP/SSE, stdio, OpenAPI→MCP), per-tool overrides, and a web admin UI.17MIT
- AlicenseNot gradedqualityCmaintenanceA lightweight control plane and local stdio agent that enables multiple MCP clients to connect to one local agent while configuration is managed from a remote control plane, supporting tool naming, exposure control, and multiple upstream source types.1,0381MIT
- FlicenseNot gradedqualityCmaintenanceSafety-first local MCP tool gate with control plane, runtime security, and observability for managing MCP backends.-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ellmos-ai/ellmos-controlcenter-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server