fw-context-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| check_ollamaA | Check whether the LLM backend is running and the configured embedding/chat model is installed. Read-only: yes. No side effects. Call before smart_search, semantic_search, or explain_symbol (when on-demand fallback is expected — pre-computed analysis returns instantly without the LLM backend). Args: project_root: Project root. Auto-detected if omitted. Ignored by this tool. Returns: dict: {ollama_enabled (bool), status (str — "ok"|"disabled"|"error"|"model_missing"), ollama_running (bool), ollama_url (str), configured_model (str), num_ctx (int), installed_models (list[str]), configured_embed_model (str), embedding_installed (bool), message (str, on error/disabled), available_code_models (list[str], when model missing), debug_log (str, optional — only when debug logging is enabled)} |
| get_active_buildA | MANDATORY FIRST CALL for C/C++ projects. Return metadata about the most recently indexed build configuration — check index health before using any other fw-context tools. Read-only: yes. Call at session start to check if the index exists, how many symbols it contains, and whether a reindex is needed. Use the
When Args: project_root: Project root directory. Auto-detected from CWD if omitted. Returns: dict: {config_hash, project_id, project_root, build_system, compile_commands, indexed_at (ISO timestamp), symbol_count, file_count, reference_count, modified_files_count (int), header_affected_tus (int — number of TUs with stale header dependencies), manifest_verification (str — "full" when manifest.json exists, "none" otherwise), analyzed_symbols (int), unanalyzed_symbols (int — definition symbols still needing LLM analysis), analysis_model (str or None), vendor_paths (list[str] — config index.vendor_paths), project_paths (list[str] — config index.project_paths), bg_reindex_running (bool), reindex_progress (str or None — last log line when reindex is running), schema_version (int — DB schema version), current_schema (int — code expects), status (str — "ready"|"reindexing"| "reindex_needed"|"no_index"|"error"), reindex_needed (bool — structural mismatch requiring a full reindex), reindex_reasons (list[str] — why reindex is needed, empty when False), index_message (str — human-readable summary of index state)} |
| get_project_infoA | Return project metadata (name, type, root_path) for a project ID. Looks up the global project registry at Read-only. No side effects. Args: project_id: Project ID (UUID4 hex) to look up. Returns: dict: {project_id, name, project_type, root_path, created_at, updated_at} or {"error": "..."} when the project_id is not registered. |
| list_projectsA | List all indexed firmware projects with their statistics. Read-only. No side effects. Use at session start to discover available
projects; use Args: project_root: Project root. Auto-detected if omitted. Pass to distinguish multiple indexed projects. Returns: list of dicts, each with: project_id, name, root_path, build_system, symbol_count, file_count, indexed_at, schema_version, current_schema, reindex_needed (bool), status (str), db (path to SQLite database file). |
| reindex_fileA | Re-parse a single source file with libclang and update its symbols in the index. Not read-only — uses the exact compiler flags from Also regenerates LLM analysis and method override relationships for affected symbols when those features are enabled in config. Args: file_path: Path to source file to re-parse. Must be in compile_commands.json. project_root: Project root directory. Auto-detected if omitted. Returns: dict: {file, translation_units, symbols_updated, elapsed_s, analysis_updated (if LLM enabled), or error}. |
| reindex_file_implA | Re-parse a single source file with libclang and update its symbols in the index. Shared implementation used by Requires an existing index ( Args: file_path: Absolute or project-relative path to the source file to re-parse. Must have a matching entry in compile_commands.json. project_root: Project root directory. Auto-detected from cwd if omitted. with_analysis: When True (default), also regenerates LLM symbol analysis and method override relationships — slower but produces a fully up-to-date index. Set to False for a fast symbol-only update (used by background auto-reindex). Returns:
On success — dict with keys:
file (str): Resolved absolute path to the re-indexed file.
translation_units (int): Number of TUs that include this file.
symbols_updated (int): Number of symbols written/updated.
elapsed_s (float): Parse + store time in seconds.
analysis_updated (int, optional): Symbol count with fresh LLM
analysis (only present when LLM analysis is enabled and
with_analysis=True).
analysis_warning (str, optional): Reason LLM analysis was skipped.
overrides_warning (str, optional): Reason override analysis was skipped.
warning (str, optional): Header re-indexed via a single TU — other
TUs including this header may still have stale symbols; run
|
| reset_indexA | Delete the entire symbol index for a project. Not read-only — permanently deletes the SQLite database and WAL files.
Call with Handles corrupt databases gracefully — you can delete a corrupt index without needing to open it first. Args: project_root: Project root directory. Auto-detected if omitted. confirm: Must be True to execute. Call without first as dry-run. Returns: dict: {project_root, db, project_id, action: "dry_run"|"deleted", message, symbol_count, indexed_at (dry-run)}. |
| lookup_symbolA | Look up a C/C++ symbol by name via libclang index — exact or prefix matching. Finds symbols text-based search can miss: build-conditional code, template instantiations, macro-expanded names. Prefer this when you know the exact symbol name or prefix. Falls back to macro lookup. Finds symbols text-based search can miss: build-conditional code, template
instantiations, macro-expanded names. Macros are extracted via
Read-only: yes. May auto-reindex stale files (non-blocking). Args: name: Symbol name (exact match) or prefix (set exact=False). E.g. 'uart_init' finds the exact function; 'uart_' finds all symbols starting with 'uart_'. project_root: Project directory. Auto-detected if omitted. exact: True = exact name match, False = prefix LIKE match (default). limit: Maximum results (default 50). Returns:
list[dict]: Symbols with name, qualified_name, kind, file, line,
signature, docstring, is_definition, is_template, is_virtual,
is_pure_virtual fields. Enum constants include |
| search_codeA | Find C/C++ symbols by name — searches function/class/enum NAMES. Searches symbol names, qualified names, signatures, docstrings, and
pre-computed name tokens (CamelCase/snake_case split). Does NOT search
function bodies — for patterns in code like Use when you know the concept but not the exact name
( Results include names, file locations, signatures, and docstrings — the metadata about each symbol, not the symbol's implementation code. FTS5 syntax:
Progressive relaxation: when the initial FTS5 search returns nothing, the tool automatically broadens the search in up to six steps:
Results from fallback steps carry Kind filter values: Each result may include Read-only. No side effects. Args: query: FTS5 search terms. Keep queries short — 1–3 words. project_root: Project root directory. Auto-detected from CWD if omitted. kind: Optional filter to return only symbols of this kind. limit: Maximum results (default 20, max 100). project_only: When True, exclude vendor SDK directories and return only application code. Default False. Returns:
list of dicts, each with: name, qualified_name, kind, file, line,
is_definition, signature, docstring, is_template, is_virtual,
is_pure_virtual. Enum constants include |
| search_bodiesA | Find patterns in C/C++ function BODIES — the implementation code inside Searches ONLY the text between When to use
Limitations — what Only function/method definition bodies are indexed (
LIMITATION — search_bodies ONLY searches function bodies ({ }):
If your pattern might be at file scope (class member declarations like
For these patterns, use When to set
Set Results include Read-only. No side effects. Requires the FTS5 index. Args:
query: FTS5 search terms. 1-3 words. Bare multi-word queries are
OR-joined (each term prefixed with Returns: list of dicts, each with: name, qualified_name, kind, file, line, is_definition, signature, _match_snippet (excerpt around match), source (function body, truncated at 2000 chars). |
| search_contentA | Find patterns in FULL file content — not limited to function bodies. Searches ifdef-filtered file text — only code that actually compiles
for the current build configuration. Inactive Covers file-scope constructs that When to use
project_only=True filters to files with Results are file-level (one entry per matching file) — use
When Read-only. No side effects. Requires the FTS5 index with file content. Args:
query: FTS5 search terms. 1-3 words. Bare multi-word queries are
OR-joined (prefix-wildcarded). Prefer single-word queries.
E.g. Returns: list of dicts, each with: file, language, mtime, _match_snippet (highlighted excerpt around the match). |
| semantic_searchA | Semantic search using pre-computed libclang symbol embeddings. Finds
symbols by meaning, not by text — matches concepts even when query
words don't appear literally in the code. Uses cosine similarity over
variable-dimension embeddings generated during When to prefer over search_code: When you're describing a concept rather than searching for a known keyword. Examples:
When to prefer search_code instead: When you know the exact keyword
or symbol name ( Threshold guidance (mxbai-embed-large model):
Source-aware ranking: Project code boosted 1.2×, library code 1.1×, vendored SDK code 0.85×. Requires an LLM with an embedding model.
Falls back to Read-only. No side effects. Args: query: Natural language description of what you're looking for. Be specific — 5–15 words works best. project_root: Project root. Auto-detected if omitted. threshold: Minimum cosine similarity (0.0-1.0). Default 0.60. limit: Maximum number of results (default 20, max 100). Returns:
list of dicts, each with: name, qualified_name, kind, file, line,
is_definition, signature, docstring, plus |
| smart_searchA | Natural-language search: an LLM generates FTS5 keywords, then searches the libclang index. Finds concepts by meaning rather than exact text match. Prefer this when you don't know the exact keywords and want to describe what you're looking for ("how does the modem connect?", "handle BLE pairing failure"). Read-only. No side effects. Slow (10-30 s) — delegates to the full
Multi-phase approach:
When to prefer over search_code: When you don't know the exact keywords and want to describe what you're looking for ("how does the modem connect?", "handle BLE pairing failure"). Fallback: When LLM is unavailable, falls back to direct FTS5 search with word-split terms from the query. Args: query: Natural language description of what you're looking for. Be specific — 5–15 words works best. project_root: Project root directory. Auto-detected from CWD if omitted. limit: Maximum number of results (default 20, max 100). Returns: list of dicts with metadata entries (_generated_queries, _rough_queries, _translated_from) followed by symbol results with name, qualified_name, kind, file, line, is_definition, signature, docstring. |
| find_all_callers_recursiveA | Find all transitive C/C++ callers — who calls name, directly or indirectly, through the libclang call graph including function-pointer edges. libclang-powered: follows function-pointer assignments and ISR vector registrations across the full call tree. Use for impact analysis: "if I change this function, how far does the
ripple go?" Returns callers at depth 1 (direct), depth 2 (callers of
callers), up to For a flat, single-level caller list use Read-only. No side effects. Requires the reference index
( Args: name: Symbol name to find transitive callers of. project_root: Project root. Auto-detected if omitted. max_depth: Maximum BFS depth for transitive search (default 5). limit: Maximum results (default 50). Returns:
list of dicts, each with: caller (str — caller name),
caller_qualified_name (str), depth (int — distance from target),
file (str), line (int), ref_kind ( |
| find_call_pathA | Find call paths between two C/C++ functions via BFS in the libclang call graph, including function-pointer edges and ISR vector registrations. libclang-powered: follows function-pointer edges and ISR vector registrations that text-based search cannot resolve. Use to answer "how does A reach B?" — e.g. tracing how a high-level
event handler eventually calls a low-level driver. Returns up to 5
shortest paths, each with For one-sided exploration use Read-only. No side effects. Requires both symbols to be in the index
and refs enabled ( Args: from_name: Starting symbol for path search. to_name: Target symbol to find path to. project_root: Project root. Auto-detected if omitted. max_depth: Maximum BFS depth for path search (default 10). Returns:
list of dicts, each with: depth (edge count, int), chain (str —
e.g. |
| find_callees_recursiveA | Find all transitive C/C++ callees — what name calls, directly or indirectly, through the libclang call graph including function-pointer edges. libclang-powered: follows function-pointer calls and indirect invocations across the full dependency tree. Use for dependency analysis: "what does this function depend on to do
its job?" Returns callees at depth 1 (direct), depth 2 (callees of
callees), up to For direct callees only, Read-only. No side effects. Requires the reference index
( Args: name: Symbol name to find transitive callees of. project_root: Project root. Auto-detected if omitted. max_depth: Maximum BFS depth for transitive search (default 5). limit: Maximum results (default 50). Returns:
list of dicts, each with: callee (str — callee name),
callee_qualified_name (str), depth (int — distance from source),
file (str), line (int), ref_kind ( |
| find_callersA | Find who calls a C/C++ function — direct calls AND indirect via function pointers, callbacks, interrupt vector registrations, and struct init lists. libclang-powered: detects function-pointer assignments and ISR vector registrations that text-based search cannot see. Falls back to macro lookup when the symbol is not found as a function/method: returns the macro definition (kind="macro") and files that use it (ref_kind="macro_use"). Use when you need a quick, flat list of immediate callers. For the full
transitive call tree (who calls this indirectly through other functions),
use Read-only. No side effects. Requires the reference index
( Indirect edges (
Args:
name: Symbol name to find callers of. Uses the same three-tier
resolution as Returns:
list of dicts, each with: file, line, ref_kind ( |
| find_dead_codeA | Find C/C++ functions that are defined but never called — libclang-powered dead code detection across the entire indexed codebase. Distinguishes called from uncalled symbols globally, not just within a single file — text-based search cannot determine whether a function is actually reachable. Returns two categories of results, each with a
Implicit constructor calls through global/static object and member-field
initialization are detected as By default, SDK/vendor paths are auto-excluded via the Read-only. No side effects. Requires the reference index
( Args:
project_root: Project root. Auto-detected if omitted.
limit: Maximum results (default 100).
exclude_paths: Additional LIKE patterns to exclude (user-supplied
tool parameter, not config). E.g. Returns:
list of dicts, each with: name, qualified_name, kind, file, line,
status ( |
| find_hotspotsA | Find the most-called C/C++ functions ranked by caller count — libclang call-graph hotspot detection. Identifies functions with the most architectural weight — good targets for refactoring, optimization, or extra testing. Text-based search cannot aggregate caller statistics across the full call graph. Use for high-level impact assessment: changing a hotspot affects many call sites. The result tells you which functions carry the most "architectural weight" across the entire codebase. By default, SDK/vendor paths are auto-excluded so hotspots reflect
project code. Use For the callers of a specific hotspot, follow up with Read-only. No side effects. Requires the reference index
( Args:
project_root: Project root. Auto-detected if omitted.
limit: Number of top-called functions to return (default 20).
project_only: When True (default), filters to Returns: list of dicts, each with: name, qualified_name, kind, file, line, caller_count (int — total number of call sites), signature. |
| find_indirect_call_sitesA | Find indirect call sites where a C/C++ function pointer field or
variable is invoked. libclang-powered: resolves calls through
function pointers (e.g. Returns locations where a function pointer is called through a field
access ( Read-only. No side effects. Use this to answer "where is this function
pointer invoked?" as opposed to For the reverse query — which functions are assigned to a given field
or parameter — use Requires the reference index ( Args:
name: Name of the function pointer field or variable.
E.g. Returns:
list of dicts, each with: file, line, expr_text (the callee
expression, e.g. |
| find_indirect_targetsA | Find functions assigned to a C/C++ function pointer field or variable. libclang-powered: links assignment sites to call sites via the field's unique symbol reference, which text-based search cannot resolve. Links assignment sites ( Returns each function that could be invoked through the named function
pointer, showing both the assignment location and the call site(s).
When a function is assigned but no call site is found, For the reverse query — where is this field or parameter called — use
Read-only. No side effects. Requires the reference index
( Args:
name: Name of the function pointer field, variable, or parameter.
E.g. Returns: list of dicts, each with: rhs_name (assigned function), rhs_qname, fn_ptr_type, method (assignment/call_arg/var_init/ init_list), assign_file, assign_line, assign_caller, call_file, call_line, call_expr_text. |
| find_referencesA | Find ALL references to a C/C++ symbol — calls, reads, member accesses, function pointer registrations, template references, and macro usages. libclang-powered: detects function-pointer registrations (interrupt vector table writes, callback attachments, ISR handler assignments) that text-based search cannot see. Falls back to macro lookup when the symbol is not found as a function/method: returns the macro definition (kind="macro") and files that reference it (ref_kind="macro_use"). Read-only. No side effects. Returns every reference in the indexed codebase,
including call sites, variable reads, struct member accesses, indirect
function-pointer references, and macro usages. Requires the reference
index ( For direct callers only use Args: name: Symbol name to find all references of. project_root: Project root directory. Auto-detected if omitted. limit: Maximum results (default 50, max 200). Returns:
list of dicts, each with: file, line, ref_kind, caller, caller_kind.
|
| find_wrapper_callersA | Find C/C++ wrapper classes that call methods of a driver class —
libclang-powered adapter pattern detection. Traces method ownership
across class boundaries to reveal the wrapper/adapter architecture
(e.g. Returns wrapper methods grouped by wrapper class, showing which driver
methods each wrapper calls. Useful for understanding the adapter/wrapper
architecture (e.g. For the reverse perspective — finding who calls a specific driver method
— use Read-only. No side effects. Requires the reference index
( Args:
class_name: Driver class name to find wrappers for.
E.g. Returns: list of dicts, each with: wrapper_class (str), method_count (int), methods (list of dicts — each with method, qualified_name, kind, and calls (list of driver methods called)). |
| trace_data_flowA | Trace how C/C++ data of a given type flows to a target function via libclang call paths. libclang-powered: finds functions by type signature and maps call paths through the full call graph, which text-based search cannot trace across translation units. Finds functions whose signature mentions type_name, then looks for call paths from those functions to to_symbol. Returns a data flow map — useful for understanding how a data structure travels through the system to its destination. Works best for synchronous driver stacks (e.g. sensor read → I2C write).
Cannot follow async flows (message queues, interrupts, RS485 callbacks).
For exact call-graph queries use the Read-only. No side effects. Requires the reference index
( Args:
type_name: Type name to trace. E.g. Returns:
list of dicts with a leading |
| explain_symbolA | Explain what a C/C++ symbol does in plain English — libclang-aware
analysis. Uses pre-computed LLM analysis when available (instant),
falls back to on-demand LLM. Falls back to macro explanation when
the name matches a Read-only. No side effects — uses pre-computed LLM analysis when available
(instant, generated during For raw source code use Args:
name: Symbol name to explain. E.g. Returns:
dict: {name, kind, file, line, signature, explanation, llm_analysis
(if pre-computed)}, plus source/explain_prompt on fallback. Macro
fallback returns |
| get_file_mapA | Fast structural map of all C/C++ symbols in a file grouped by kind — libclang-powered table of contents. Like a table of contents before reading a chapter: see what functions, classes, and enums a file defines at a glance. Pass a path relative to the project root ( Enum constants ( For detailed symbol information use Read-only. No side effects. Use before reading a large file to orient yourself — see what functions, classes, and enums it defines. Args: file_path: Path relative to project root, or just the filename. project_root: Project directory. Auto-detected if omitted. signatures: Include full function signatures. Default: False. max_per_kind: Max items per kind group (default 30, 0 = unlimited). Returns: dict: {file, total_symbols, symbols: {kind: {count, items[], subgroups?[]}}} |
| get_sourceA | Read a C/C++ function/method/enum/macro body using libclang exact extents — no guessing line numbers. Uses AST-precise {start, end} extents so you get exactly the function body. Generic file readers don't know where a function actually ends — libclang tracks exact {start, end} from the AST. For enums, includes a For rich context (who calls this, what does it call) use
Read-only. No side effects. Args: name: Fully qualified symbol name. Returns exact function body via libclang extent. project_root: Project root. Auto-detected if omitted. Returns:
dict: {name, qualified_name, kind, file, line, signature,
docstring, is_definition, is_template, is_virtual, is_pure_virtual,
source (str — the function/enum/macro body, truncated at 8000 chars),
warning (str, optional — when source file cannot be read)}.
May also include |
| get_symbol_contextA | Rich one-shot context for a C/C++ symbol: body, signature, all direct callers and callees. Answers "what does this do and how does it fit in the system?" in a single response — libclang powers the call graph, not regex. Falls back to macro display when the symbol is not found. Prefer this over Returns ALL callers and callees including vendor/SDK code — the call graph naturally spans project and vendor boundaries in both directions (project → vendor API, vendor callback → project handler). Read-only. No side effects. Args: name: Symbol name. Returns body, signature, all direct callers and callees. project_root: Project root. Auto-detected if omitted. Returns:
dict with: name, qualified_name, kind, file, line, signature,
docstring (raw Doxygen comment text), is_definition, callers (list),
callees (list), source (body text),
indirect_call_sites (list, for field/variable symbols — where the
function pointer is actually invoked).
For field and variable symbols that have function pointer type,
also includes |
| read_fileA | Read a complete C/C++ source file with ifdef-filtered content —
only code that actually compiles for the current build configuration.
Inactive Use this to read a file without leaving the fw-context ecosystem.
Unlike generic file readers, this tool returns build-accurate content:
code gated behind For reading a single function body with libclang exact extents use
Read-only. No side effects. Falls back to raw disk content (with a
warning) when the indexed Args:
file_path: Path relative to project root, or just the filename.
E.g. Returns:
dict: {file (str), language (str — |
| get_class_membersA | Return all methods, fields, and nested types of a C/C++ class/struct — libclang-powered member table. Groups members by kind (method, constructor, field, enum, etc.), distinguishing class members from free functions across the entire codebase. Members are grouped by kind (method, constructor, destructor, field, enum, typedef, class, struct). Each member includes its signature, virtual flags, and source line. Works for C structs too — they just won't have methods. For inheritance hierarchy use Read-only. No side effects. Args:
class_name: Class or struct name. E.g. Returns: dict: {name, qualified_name, kind, file, line, members: {kind: [{name, qualified_name, signature, is_virtual, is_pure_virtual, line}]}, member_count} |
| get_inheritance_chainA | Return the C++ inheritance chain for a class or struct — libclang-aware hierarchy. Resolves base/derived class relationships across all translation units, which single-file reading cannot do. Shows direct base classes (what this inherits from) and direct derived classes (what inherits from this), along with access level and virtual flag for each edge. When For class members use Read-only. No side effects. Args:
class_name: Class or struct name to get inheritance information for.
E.g. Returns: dict: { name, qualified_name, kind, file, line, bases: [{name, usr, access, is_virtual, file}], derived: [{name, usr, access, is_virtual, file}], all_bases: [...] (when transitive=True, ancestors sorted by depth), all_derived: [...] (when transitive=True, descendants sorted by depth) } |
| get_method_overridesA | Return C++ virtual method override information — libclang-powered vtable analysis. Resolves virtual dispatch across class hierarchies: shows which base-class method this overrides, and which derived-class methods override this one. Text-based search cannot resolve virtual dispatch across translation units. Shows what base-class method this method overrides, and what derived-class
methods override this one. Built from the For class-level inheritance, use Read-only. No side effects. Args:
method_name: Method name to get override information for. Use
qualified name for disambiguation, e.g.
Returns: dict: { name, qualified_name, kind, file, line, signature, overrides: [{usr, name, qualified_name, kind, file, line}], overridden_by: [{usr, name, qualified_name, kind, file, line}] } |
| get_template_instancesA | Find all template instantiations for a C/C++ class or function template — libclang template-aware lookup. Finds concrete instantiations spread across all translation units, each with its full type signature. Text-based search cannot resolve template specializations across translation units. Returns concrete instantiations of the template — each with its full type
signature (e.g. Uses the For finding the template declaration itself use Read-only. No side effects. Args:
template_name: Template name to find instantiations for.
E.g. Returns: list[dict] with one element wrapping the template declaration: {name, qualified_name, kind, file, line, is_definition, signature, instances (list of dicts, each with name, qualified_name, kind, file, line, signature, is_definition), instance_count (int)} |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| resource_stats | Return a human-readable markdown summary of all indexed projects. Read-only. Aggregates stats from every project database found under the configured index directory. |
| resource_projects | Return project list as a JSON string. Read-only. Uses the same data as ``list_projects``, serialized as indented JSON. |
| resource_embedded_review_skill | Return the fw-review SKILL.md as an MCP resource. Read-only. Makes the embedded firmware review methodology available to any MCP client via a well-known resource URI. |
Latest Blog Posts
- 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/turbyho/fw-context-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server