Skip to main content
Glama
glachana

bc-source-mcp

by glachana

bc-source-mcp

npm license

Serveur MCP (Model Context Protocol) qui expose les sources de Microsoft Dynamics 365 Business Central — toutes versions (BC v23 -> v29), toutes localisations (W1 + 47 pays), avec et sans vNext — a des agents IA comme Claude Code et Claude Desktop.

Vous voulez juste l'installer pour l'utiliser ? Voir INSTALL.md.

Donnees pompees du depot communautaire StefanMaron/MSDyn365BC.Sandbox.Code.History. Le serveur fait un partial clone (~1,6 Go au lieu de 50-100 Go) puis indexe les objets AL dans une base SQLite locale, ce qui permet des lookups a <100 ms.


A quoi ca sert

Pour un agent IA qui code en AL, devoir deviner la signature d'une procedure standard, le nom exact d'un event publisher ou la liste des champs d'une table BC est une cause majeure d'hallucinations. Ce MCP donne a l'agent un acces structure et verifie au code source BC, sans dependre de sa memoire d'entrainement.

Exemples d'usages typiques :

  • Trouver les IntegrationEvent a souscrire dans Approvals Mgmt. en v27

  • Recuperer la definition exacte de la table Customer en localisation FR vs W1

  • Chercher tous les usages d'un motif de code a travers la Base Application

  • Comparer la presence d'un objet entre plusieurs versions

Related MCP server: OpenCodeHub MCP Server

Les 14 tools exposes

Categorie

Tool

Description

Decouverte

bc_list_branches

Liste les 545 branches du repo upstream

Decouverte

bc_list_versions

Versions BC (23 -> 29, avec ou sans vNext)

Decouverte

bc_list_localizations

47 codes pays + W1

Decouverte

bc_list_apps

Apps top-level d'une branche

Decouverte

bc_list_objects

Objets AL filtres (type / app / pattern) avec pagination

Decouverte

bc_find_object_across_branches

Presence d'un objet a travers les branches indexees

Lookup

bc_get_object

Source AL d'un objet (avec line_start/line_end/include_source pour les gros objets)

Lookup

bc_get_event_publishers

Events publies par un objet (IntegrationEvent, BusinessEvent, InternalEvent)

Lookup

bc_get_procedure

Procedure ciblee avec signature, body, attributes

Recherche

bc_search_code

Recherche regex via ripgrep, scope par app/type (avec timeout de 30s)

Recherche

bc_search_fts

Full-text FTS5 cross-branch, syntaxe FTS5 (tokens, phrases, prefix*) avec snippets

Admin

bc_refresh

Re-fetch + re-index d'une ou toutes les branches

Admin

bc_cache_status

Disk usage + branches indexees

Admin

bc_prune_cache

Suppression selective de worktrees

Note : apres une mise a jour vers une version qui introduit l'index FTS5, les branches deja indexees ne sont pas automatiquement re-indexees. Lancez bc_refresh sur les branches que vous voulez voir apparaitre dans bc_search_fts.

Installation

Voie 1 — via NPM (recommande)

Claude Code :

powershell claude mcp add bc-source-mcp -s user -- npx -y bc-source-mcp

Claude Desktop — editez %APPDATA%\Claude\claude_desktop_config.json :

json { "mcpServers": { "bc-source-mcp": { "command": "npx", "args": ["-y", "bc-source-mcp"] } } }

Le binaire bc-source-mcp est expose par le bin de package.json. npx -y recupere la derniere version a chaque demarrage (cache npm); pour epingler une version, utilisez bc-source-mcp@0.1.0.

Voie 2 — clone GitHub (pour contribuer)

powershell git clone https://github.com/glachana/bc-source-mcp.git cd bc-source-mcp npm install npm run build .\scripts\setup.ps1 -ClaudeCode -ClaudeDesktop

Guide utilisateur complet : INSTALL.md.

Configuration

Variables d'environnement utilisables (toutes optionnelles) :

Variable

Defaut

Description

BC_SOURCE_CACHE_DIR

~/.bc-source-mcp/

Cache local (partial clone + worktrees + SQLite). ~2-5 Go selon les versions indexees.

BC_SOURCE_REPO_URL

StefanMaron/MSDyn365BC.Sandbox.Code.History

URL du repo upstream -- override si vous avez un fork

BC_SOURCE_LOG_LEVEL

info

trace/debug/info/warn/error/fatal

Pour les passer a Claude Code : ajoutez -e KEY=VALUE a la commande claude mcp add. Pour Claude Desktop : ajoutez une cle env a l'entree mcpServers.

Maintenance

Il y a deux choses distinctes a garder a jour :

MAJ du serveur

  • Installation NPM : npm install -g bc-source-mcp@latest (ou retirer le cache npx)

  • Installation depuis Git : .\scripts\update.ps1

Ensuite redemarrez Claude Code/Desktop.

MAJ des donnees BC en cache (sources upstream)

Independamment du code du serveur, vous voulez parfois rafraichir les sources BC en cache pour recuperer les derniers commits upstream (par ex. quand Microsoft publie un nouveau cumulative update).

Dans votre client MCP, demandez a Claude :

Avec bc_refresh, rafraichis l'index de la branche w1-26.

Ou pour toutes les branches indexees :

Avec bc_refresh sans parametre, rafraichis toutes les branches.

Le tool bc_cache_status vous donne a tout moment la taille disque + la liste des branches en cache.

Developpement

powershell npm install npm run build # tsc -> dist/ npm test # vitest npm run inspector # MCP Inspector pour tester en interactif

Tests : 54 unit tests sur les parsers AL (object header, events, procedures) et le branch resolver.

Architecture

Le serveur maintient un cache local sous ~/.bc-source-mcp/ :

~/.bc-source-mcp/ +-- repo/ Partial clone Git unique (--filter=blob:none, ~1,6 Go) +-- worktrees/<branch>/ Worktrees Git checkout-es a la demande +-- index.db SQLite : branches, apps, objects, event_publishers

A la premiere requete sur une branche (ex. w1-26) :

  1. git fetch origin <branch> (blobs telecharges a la demande grace au partial clone)

  2. git worktree add du checkout complet de la branche

  3. Walk recursif de tous les *.al -> parsing header + events -> insert SQLite

  4. Lookups ulterieurs : tout en RAM/SQLite, <100 ms

Branches du repo upstream : 545 (47 localisations x 7 versions, avec ou sans vNext). Sur w1-26 : ~15 000 objets AL et ~22 000 event publishers indexes en ~10 s.

Stack

Contribuer

Issues et PR bienvenues sur https://github.com/glachana/bc-source-mcp.

Le projet utilise Conventional Commits + release-please pour le versioning et la publication npm automatiques. Lire CONTRIBUTING.md avant d'ouvrir une PR.

Roadmap d'ameliorations en cours : IMPROVEMENTS.md.

Licence

MIT (c) 2026 Gabriel Lachana.

Available Tools

14 tools
bc_cache_statusCache disk usage and indexed branchesA
Read-onlyIdempotent

Reports the total disk usage of the bc-source-mcp cache, the number of indexed branches, their object counts, and last fetch/index dates.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
cache_rootYes
repo_size_mbYes
worktrees_size_mbYes
total_size_mbYes
indexed_branchesYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint. The description adds detail on what is reported (disk usage, branch counts, object counts, dates), which is beyond the annotations. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, front-loaded with the main action ('Reports the total disk usage...'), no unnecessary words. Every phrase adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists, the description is sufficient. It covers all aspects of a status-reporting tool, including disk usage and branch details, for a simple tool with no parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, so baseline is 4. The description adds meaning by listing the specific metrics reported, which compensates for the lack of parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it reports total disk usage, number of indexed branches, object counts, and dates. It uses specific nouns (cache, branches, objects) and distinguishes from sibling tools like bc_prune_cache.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use or alternatives are provided. However, the name and description imply it is for inspecting cache status, and siblings like bc_prune_cache serve different purposes, so the usage context is somewhat implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bc_find_object_across_branchesFind an object across indexed branchesA
Read-onlyIdempotent

Searches for an AL object (by type and exact name) across all branches that have already been indexed in this MCP instance. Use this to compare presence/path of an object across versions or localizations. Does not trigger indexing — call bc_list_apps on a branch first if you want to include it.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeYesAL object type (table, page, codeunit, ...)
nameYesExact object name
branchesNoOptional list of branches to restrict the search to (e.g. ["w1-26", "fr-26"]). If omitted, searches all indexed branches.

Output Schema

ParametersJSON Schema
NameRequiredDescription
typeYes
nameYes
totalYes
resultsYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint and idempotentHint, so the description adds value by clarifying that indexing is not triggered, which is important context 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with purpose and a clear usage guideline. No extraneous words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, idempotent search tool with full schema descriptions and an output schema, the description covers purpose, usage, and the key behavioral note about indexing. Complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds minimal extra meaning beyond what the schema already provides for each parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches for an AL object by type and exact name across indexed branches, distinguishing it from siblings like bc_get_object (retrieves single object) and bc_list_objects (lists objects in a branch).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use ('compare presence/path of an object across versions or localizations') and what not to assume ('Does not trigger indexing — call bc_list_apps on a branch first if you want to include it').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bc_get_event_publishersGet event publishers of an AL objectA
Read-onlyIdempotent

Lists all event publishers ([IntegrationEvent], [BusinessEvent], [InternalEvent]) defined inside a specific AL object. Returns the event name, kind, full procedure signature, attribute, and source line. Useful for finding events to subscribe to.

ParametersJSON Schema
NameRequiredDescriptionDefault
branchYesBranch name, e.g. "w1-26"
source_typeYesContainer object type (typically "codeunit", but can be "table", "page", etc.)
source_nameYesContainer object name, e.g. "Approvals Mgmt." (without quotes)

Output Schema

ParametersJSON Schema
NameRequiredDescription
branchYes
source_typeYes
source_nameYes
totalYes
eventsYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate safe, idempotent, and open-world behavior. The description adds value by detailing what exactly is listed (event name, kind, procedure signature, attribute, source line) and the types of events, going 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences long, front-loaded with the main action and output, followed by a use case. Every word is necessary, with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema and comprehensive annotations, the description is complete: it explains the tool's purpose, what it returns, and when to use it. No gaps are evident.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents parameters. The description adds context by linking parameters to 'a specific AL object,' but does not elaborate on individual parameters. Baseline is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists event publishers defined inside a specific AL object, specifying the verb 'lists' and the resource. It also details the output fields, making the purpose unmistakable and distinct from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes 'Useful for finding events to subscribe to,' which provides clear context for when to use this tool. It does not explicitly exclude alternatives, but the context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bc_get_objectGet the source of an AL objectA
Read-onlyIdempotent

Returns the AL source of a specific object (table, page, codeunit, report, enum, query, xmlport, or any extension). Identifies the object by branch + type + name (case-insensitive on type, exact on name). Triggers indexing on first use of a branch. Use line_start/line_end to fetch only a slice (1-indexed, inclusive) — useful for large objects (~100k lines). Use include_source=false to skip the source and get only metadata (size, total_lines).

ParametersJSON Schema
NameRequiredDescriptionDefault
branchYesBranch name, e.g. "w1-26"
typeYesAL object type, e.g. "table", "page", "codeunit"
nameYesObject name (without quotes), e.g. "Customer", "Sales Header"
line_startNoOptional 1-indexed start line (inclusive). Default 1.
line_endNoOptional 1-indexed end line (inclusive). Default: last line.
include_sourceNoIf false, omits the source string and returns only metadata. Default true.

Output Schema

ParametersJSON Schema
NameRequiredDescription
branchYes
typeYes
idYes
nameYes
appYes
pathYes
ext_targetYes
sourceYes
size_bytesYes
total_linesYes
returned_linesYes
truncatedYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnly and idempotent hints. Description adds that indexing is triggered on first use of a branch and specifies case-insensitivity on type. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each serving a purpose: main function, identification details, indexing side effect, optional parameter usage. Front-loaded with purpose, no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 6 parameters (3 required) and an output schema, the description covers object identification, optional slicing, metadata-only mode, and indexing. Output schema exists so return values need not be detailed. Complete for an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%. Description adds meaningful details: line_start/line_end are 1-indexed and inclusive, branch example 'w1-26', object types enumerated, name examples given, and include_source explained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns AL source for specific object types and identifies objects by branch, type, and name. It is specific but does not explicitly differentiate from sibling tools like bc_get_procedure or bc_get_event_publishers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on using optional parameters (line_start/line_end for slicing, include_source for metadata-only). Mentions indexing trigger on first branch use. Lacks explicit when-not-to-use guidance but is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bc_get_procedureGet a specific procedure from an AL objectA
Read-onlyIdempotent

Returns the signature, body, attributes, and modifier of a named procedure within an AL object. Useful when you only need a single procedure rather than the full object source.

ParametersJSON Schema
NameRequiredDescriptionDefault
branchYesBranch name, e.g. "w1-26"
object_typeYesType of the object containing the procedure, e.g. "codeunit"
object_nameYesName of the object containing the procedure
procedure_nameYesName of the procedure to retrieve (case-insensitive)

Output Schema

ParametersJSON Schema
NameRequiredDescription
branchYes
object_typeYes
object_nameYes
pathYes
procedureYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint, idempotentHint, and openWorldHint, which cover safety and idempotency. The description adds value by specifying the exact components returned (signature, body, attributes, modifier), providing behavioral clarity 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences with no extraneous information. The first sentence front-loads the key functionality, and the second provides context. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists (though not shown), the description does not need to detail return values. It covers purpose, usage context, and parameters adequately. Annotations provide safety guarantees. The description is complete for an agent to select and invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 100% description coverage with clear descriptions for each of the 4 parameters. The tool description does not add additional insight beyond the schema, so baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool returns the signature, body, attributes, and modifier of a named procedure. It distinguishes from the sibling tool bc_get_object by noting it is for a single procedure rather than the full object.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states it is 'useful when you only need a single procedure rather than the full object source,' providing clear usage context. It does not mention when not to use or list alternatives explicitly, but the sibling context implies alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bc_list_appsList apps in a branchA
Read-onlyIdempotent

Lists top-level application folders in a given branch (e.g. "Base Application", "System Application", "Business Foundation"). If the branch has not been indexed yet, this triggers a first-time fetch + sparse-checkout + indexing (can take 1-5 minutes the first time).

ParametersJSON Schema
NameRequiredDescriptionDefault
branchYesBranch name, e.g. "w1-26", "fr-27-vNext"

Output Schema

ParametersJSON Schema
NameRequiredDescription
branchYes
appsYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the important side effect of triggering indexing on first use, beyond the annotations which already mark it as read-only and idempotent. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the main purpose, followed by essential behavior context. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one parameter, output schema, and annotations, the description covers the purpose, parameter, and potential delays, making it complete for an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, the schema already documents the branch parameter well. The description does not add additional semantics beyond restating the parameter's role.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists top-level application folders in a given branch, with specific examples. This distinguishes it from sibling tools like bc_list_branches or bc_list_objects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a warning about first-time indexing taking 1-5 minutes, which implies when to use, but does not explicitly compare with alternatives 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.

bc_list_branchesList branchesA
Read-onlyIdempotent

Lists all branches available in the upstream BC sources repository (Stefan Maron mirror). Each branch corresponds to a (localization, version) pair, e.g. "w1-26", "fr-27-vNext". By default, meta/internal branches (main, base, core, serena) are filtered out. Set include_meta=true to include them.

ParametersJSON Schema
NameRequiredDescriptionDefault
include_metaNoInclude non-code meta branches (main, base, core, serena). Default false.

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
branchesYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint. The description adds specific behavioral traits: the source repository (Stefan Maron mirror), branch naming conventions, and the default exclusion of meta branches. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences front-load the core purpose, then provide necessary details about branch representation and filtering. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one optional boolean parameter, no required inputs, clear annotations, and an output schema), the description fully covers the tool's behavior, source, naming, and filtering. No gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The sole parameter 'include_meta' has 100% schema coverage. The description adds meaning by explaining what constitutes meta branches (main, base, core, serena) and that default is false. This goes beyond the schema's description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists all branches from a specific mirror, explains what branches represent (localization/version pairs), and gives examples like 'w1-26' and 'fr-27-vNext'. It distinguishes itself from sibling tools by focusing on branches.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies appropriate usage for listing branches and explicitly notes default filtering of meta branches with an option to include them. It does not explicitly state when not to use, but sibling tool names provide context for alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bc_list_localizationsList supported BC localizationsA
Read-onlyIdempotent

Lists the country/region codes available as branches in the upstream repository, with their human-readable names. "w1" is the worldwide base.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
localizationsYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint. The description adds that it lists from the upstream repository and includes the 'w1' note, which is useful context. No contradictions, and the behavior is well-disclosed for a simple read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, using two sentences to convey the purpose and a key detail. There is no wasted language, and the most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity (no parameters, clear annotations, output schema exists), the description is sufficiently complete. It informs the user of the data returned and the special case 'w1'. Minor omission: could mention that the list is static or from a specific repository.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, so the description does not need to add parameter details. It provides enough context about what the output contains (codes and human-readable names, with 'w1' explained). Baseline score of 4 for zero-parameter tools is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (lists) and the resource (country/region codes available as branches, with human-readable names). The mention of 'w1' adds specificity. It distinguishes from siblings like bc_list_branches which list branches for other purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide explicit guidance on when to use this tool versus alternatives. Usage is implied by the name and description, but no conditions or exclusions are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bc_list_objectsList objects in a branchA
Read-onlyIdempotent

Lists AL objects in a branch, with optional filters by type, app, and name pattern. Use "*" as wildcard in name_pattern (translated to SQL LIKE %). Triggers indexing on first use of a branch.

ParametersJSON Schema
NameRequiredDescriptionDefault
branchYesBranch name, e.g. "w1-26"
typeNoAL object type filter (table, page, codeunit, report, enum, query, xmlport, tableextension, pageextension, etc.)
appNoApp name filter (exact match), e.g. "Base Application"
name_patternNoName pattern with * wildcards, e.g. "Sales*", "*Header*"
limitNoMax items to return. Default 100.
offsetNoPagination offset. Default 0.

Output Schema

ParametersJSON Schema
NameRequiredDescription
branchYes
totalYes
offsetYes
limitYes
itemsYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds the important behavioral note: 'Triggers indexing on first use of a branch.' This goes beyond the annotations (readOnlyHint, idempotentHint, openWorldHint) and informs the agent of a side effect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, starting with the main purpose and then adding key details in two additional sentences. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (6 parameters, output schema exists), the description covers the main functionality and a critical side effect (indexing). It could mention pagination defaults but those are in the schema. Overall it provides sufficient context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with parameter descriptions, but the description adds value by explaining the wildcard behavior: 'Use "*" as wildcard in name_pattern (translated to SQL LIKE %).' This clarifies usage beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Lists' and the resource 'AL objects in a branch', and mentions optional filters. This distinguishes it from siblings like bc_find_object_across_branches which searches across branches.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives like bc_find_object_across_branches or bc_get_object. The description only states what the tool does, not when it is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bc_list_versionsList supported BC versionsA
Read-onlyIdempotent

Lists the Business Central major versions for which sources are available in this MCP. Set include_vnext=true to also list the preview/-vNext variants.

ParametersJSON Schema
NameRequiredDescriptionDefault
include_vnextNoAlso include vNext preview versions. Default false.

Output Schema

ParametersJSON Schema
NameRequiredDescription
versionsYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnly and idempotent. Description adds context about listing major versions and the effect of include_vnext, but no additional behavioral traits beyond what annotations and schema imply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, directly front-loaded with purpose. Every word adds value. No redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with one optional parameter and an output schema, the description is fully sufficient. No missing information needed for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%. Description adds marginal value by specifying 'preview/-vNext variants', but schema already explains the parameter well. No further semantic depth.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it lists Business Central major versions with sources in this MCP. Distinct from sibling tools like bc_list_apps or bc_list_objects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implicitly clear when to use (to get available versions), but no explicit exclusion or alternative guidance. Could mention it's for version discovery vs other listing tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bc_prune_cachePrune cached worktrees and index entriesA

Removes worktrees and index entries for branches not matching the keep filters. Pass keep_branches (explicit allowlist) or keep_versions/keep_localizations to retain only certain version/loc combinations. The partial-clone Git repo itself is never deleted.

ParametersJSON Schema
NameRequiredDescriptionDefault
keep_branchesNoExplicit branches to retain (exact names).
keep_versionsNoVersions to retain, e.g. ["26", "27"].
keep_localizationsNoLocalizations to retain, e.g. ["w1", "fr"].
dry_runNoIf true, only report what would be deleted. Default false.

Output Schema

ParametersJSON Schema
NameRequiredDescription
removedYes
keptYes
freed_mbYes
dry_runYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate mutation (readOnlyHint=false). The description adds a key guarantee that the partial-clone Git repo itself is never deleted and mentions dry_run for safe preview, enhancing transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no wasted words, front-loaded with the main action. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the pruning logic, retention filters, a safety note, and works with an output schema. It does not discuss error conditions or prerequisites but is adequate for a cache pruning tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, the description groups parameters as retention filters ('explicit allowlist', 'only certain version/loc combinations'), adding conceptual meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Removes' and the resource 'worktrees and index entries for branches not matching the keep filters', distinguishing it from sibling tools like bc_cache_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains when to use keep_branches vs keep_versions/keep_localizations, providing clear usage guidance. However, it does not explicitly mention when not to use this tool or list alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bc_refreshRefresh branch indexA
Idempotent

Re-fetches a branch from upstream and re-indexes it. If branch is omitted, refreshes every already-indexed branch sequentially.

ParametersJSON Schema
NameRequiredDescriptionDefault
branchNoSpecific branch to refresh, e.g. "w1-26". Omit to refresh all indexed branches.

Output Schema

ParametersJSON Schema
NameRequiredDescription
refreshedYes
errorsYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds behavioral context beyond annotations: describes re-fetch from upstream (write operation) and sequential refresh when branch omitted. Annotations already indicate idempotent and non-read-only, so description complements without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with action, no wasted words. Efficiently conveys all necessary information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With output schema present and simple tool (1 optional param), description provides complete context for agent to decide when to use. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with branch description. Description adds meaning by specifying effect of omitting parameter (refresh all), which is not in schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states verb ('Re-fetches and re-indexes') and resource ('branch'). Distinguishes behavior when branch is specified vs omitted. Clearly distinct from siblings like bc_cache_status which only checks cache state.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use (to refresh a specific branch or all indexed branches). Does not mention when not to use or compare to alternatives, but context is clear given sibling tool names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bc_search_codeFull-text search in BC AL source codeA
Read-onlyIdempotent

Searches AL source code in a branch using regular expressions (ripgrep). Returns matching lines with optional context. Filter by object_type (file suffix, e.g. "table" → "*.Table.al") or by app (top-level folder). Triggers indexing on first use of a branch (for the worktree).

ParametersJSON Schema
NameRequiredDescriptionDefault
branchYesBranch name, e.g. "w1-26"
patternYesRegular expression to search for
object_typeNoLimit to a specific AL object type (table, page, codeunit, ...)
appNoLimit to a single top-level app folder, e.g. "Base Application"
ignore_caseNoCase-insensitive search. Default false.
max_resultsNoMax number of matches (excluding context). Default 50.
context_linesNoLines of context to include around each match. Default 2.

Output Schema

ParametersJSON Schema
NameRequiredDescription
branchYes
patternYes
total_matchesYes
matchesYes
truncatedYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnly, idempotent, and openWorld hints. The description adds a key behavioral trait: triggers indexing on first use of a branch, which is not in annotations. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences, front-loaded with purpose, efficient without wasted words. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given complex parameters and existing output schema, the description covers purpose, filtering, side-effect (indexing). No gaps identified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions for all 7 parameters. The description adds context on how object_type and app filters work (e.g., file suffix pattern for object_type). This exceeds the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches AL source code using regular expressions (ripgrep), returns matching lines with optional context, and specifies filtering by object_type or app. This distinguishes it from sibling tools like bc_search_fts, implying a difference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use the tool (searching AL code) and how to filter. It doesn't explicitly compare to alternatives like bc_search_fts or bc_find_object_across_branches, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bc_search_ftsFull-text search via FTS5 (cross-branch capable)A
Read-onlyIdempotent

Token-based full-text search across indexed AL sources using SQLite FTS5. Faster than bc_search_code (no disk re-scan) and supports cross-branch queries. Use FTS5 syntax: bare terms ("Customer Posting"), phrases (""Sales Header""), boolean (term1 AND term2), prefixes (Cust*). Returns ranked snippets with matched tokens wrapped in <<...>>. For regex patterns, prefer bc_search_code.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesFTS5 query, e.g. "OnAfterPost", "\"Sales Header\" AND Customer", "Approv*".
branchesNoOptional list of branches to search (must already be indexed). If omitted, all indexed branches.
appNoRestrict to a single top-level app (exact match), e.g. "Base Application".
object_typeNoRestrict to a specific AL object type.
limitNoMax matches to return. Default 50.
offsetNoPagination offset. Default 0.

Output Schema

ParametersJSON Schema
NameRequiredDescription
queryYes
totalYes
offsetYes
limitYes
itemsYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint and idempotentHint, so safety is clear. The description adds that returned snippets have matched tokens wrapped in <<...>> and that branches must be indexed. It does not describe potential failure modes or rate limits, but the bar is lowered by existing annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two targeted paragraphs front-loaded with purpose and key differentiator. Every sentence serves a purpose: explaining capability, speed comparison, syntax guidance, and cross-branch support. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool (FTS5 query language, 6 parameters), the description covers output format, parameter hints, and sibling differentiation. An output schema exists (mentioned in context signals), so the description appropriately focuses on usage and behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, baseline 3. The description adds value by providing FTS5 syntax examples and clarifying that the 'branches' parameter requires pre-indexed branches. This goes beyond the schema's attribute descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Token-based full-text search across indexed AL sources using SQLite FTS5.' It distinguishes itself from sibling bc_search_code by noting it is faster and supports cross-branch queries, leaving no ambiguity about its role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly advises when to use this tool versus bc_search_code: 'For regex patterns, prefer bc_search_code.' It also explains the FTS5 syntax types supported and notes the tool works across branches, providing clear context for selection.

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.

  1. 14 tool updatesv0.1.1
    • First observedbc_cache_status
    • First observedbc_find_object_across_branches
    • First observedbc_get_event_publishers
    • First observedbc_get_object
    • First observedbc_get_procedure
    • First observedbc_list_apps
    • First observedbc_list_branches
    • First observedbc_list_localizations
    • First observedbc_list_objects
    • First observedbc_list_versions
    • First observedbc_prune_cache
    • First observedbc_refresh
    • First observedbc_search_code
    • First observedbc_search_fts

TDQS

A4.4/5.0

Scored across 14 tools

Disambiguation5/5

Each tool has a clearly distinct purpose. bc_search_code (regex) and bc_search_fts (token-based) are differentiated, as are bc_find_object_across_branches (cross-branch) and bc_list_objects (single-branch listing). No overlapping or ambiguous tools.

Naming Consistency5/5

All tools use the consistent prefix 'bc_', followed by a verb like list, get, search, find, prune, refresh. The pattern is uniform (verb_noun or verb_preposition_noun), with bc_cache_status being the only slight deviation but still clear.

Tool Count5/5

14 tools is well-scoped for the domain of Business Central source code management. Each tool addresses a specific need (listing, searching, fetching, cache management) without unnecessary redundancy or overload.

Completeness4/5

The tool surface covers read-only operations comprehensively: listing branches/versions/localizations/objects/apps, fetching source and procedures, searching, and cache management. A minor gap is lack of a direct diff tool between branches, but the core workflow is fully supported.

Maintenance

ActivityInactive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to search code by meaning, explore codebase structure, store and query knowledge with temporal facts, and read source code through a set of MCP tools.
    481
    7
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides code intelligence for AI coding agents by indexing repositories into a hybrid knowledge graph, enabling agents to query dependencies, impact, and context through 28 MCP tools.
    3
    Apache 2.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI coding assistants to semantically search and retrieve relevant code patterns, documentation, and implementations from a codebase via MCP tools.
    7
    MIT