mcp

Business Central for your agent

The knowledge base this site is built from, as an MCP server your agent can query, and a Claude Code plugin around it. Every answer carries the page, its trust tier and its evidence. No API key, no account.

What to ask

Type any of these into an agent that has the server. The tool it reaches for is on the right.

The tools

ToolWhat it doesExample
searchEvery page by title, AL object name and caption, summary and tags, plus fields, events and procedures, ranked like the site's search (t36, cu 80, plurals, one typo, synonyms); hybrid (keywords plus meaning), so a paraphrase still finds the page. A symbol ranks where its owner ranks; a kind: query that finds nothing says so and names the nearest symbols. Filter by type, tier, galaxy system, country, app, object type or kind.search('posting preview')
lsBrowse the page tree; an empty path lists the sections.ls('objects/table')
catA page's markdown: frontmatter with evidence and links, then the body. A long page comes back compact with its section keys; section, offset and limit read one part, and a symbol's path returns just that member.cat('localizations/be')
get_objectAn object of W1, a first-party app or a country layer by type and id, reference, name or caption: fields, keys, events, public procedures, obsolete state, versions, countries that replace it, Learn pages; a country layer that replaces a W1 object prints what it adds before the page. A large object comes back compact; read one section with section, offset and limit. counts.procedures in the frontmatter counts every procedure; the summary's 'public procedures' excludes locals and events.get_object('table', '18')
diff_objectMember-level changes of a W1 object between two consecutive versions: fields, events, procedures, keys, properties, obsolete state.diff_object('codeunit', 'Sales-Post', '29', '30')
localizationWhat a country layer adds to or changes in W1, with its Learn local functionality hub. Large countries come back compact, as with cat.localization('BE')
whats_newVideos, posts, roadmap features, AL extension releases and code changes (merged pull requests) dated on or after a date and up to today, newest first.whats_new('2026-10-01')
blog_footprintWhat a blog or channel covers: its posts or videos and the systems they touch.blog_footprint('kauffmann-nl')
feedbackA prefilled GitHub issue link for a page (wrong fact, missing evidence, broken link). Nothing is sent by the agent.feedback('objects/table/18', 'field 7 is wrong')

The plugin (Claude Code)

The plugin registers the server, ships four skills that tell the agent when to use it, and connects bc-code-atlas by Stefan Maron for procedure bodies and the per-procedure call graph. The observatory keeps the object-level facts; the atlas has the source. It also connects Microsoft's Learn MCP: the observatory finds the Learn page, the Learn MCP reads it and finds AL code samples.

What the plugin installs

Three MCP servers and four skills. Nothing needs an account or an API key.

ServerRun byConnects toFor, and what leaves your machine
bc-observatorythis project (waldo), the npm package run locallynpx -y bc-observatory@latestBusiness Central facts with evidence and a trust tier: objects, fields, events, versions, localizations, what changed, roadmap, videos, posts. Not procedure bodies or Learn text. Your queries stay on your machine; it downloads the site's search index and the pages you read.
bc-code-atlasStefan Maron, a free hobby server (be a polite client)https://bc-code-atlas.stefanmaron.dev/mcpAL source: a procedure body, what one procedure calls, semantic code search of one W1 version. The names and search text of your calls go to his server.
microsoft-learnMicrosoft, public endpoint, no authenticationhttps://learn.microsoft.com/api/mcpReading a Learn page the observatory points to and AL code samples. The URLs and search text of your calls go to Microsoft.

Routing: the observatory first; bc-code-atlas for procedure bodies and per-procedure edges; Microsoft Learn MCP to read a Learn page the observatory points to and for AL code samples. Switch one plugin server off with /mcp (Claude Code stops connecting to it, without removing the plugin); claude mcp remove acts on servers you added yourself, so to take only some servers install them by hand instead. A Learn MCP you already have at the same URL wins over the plugin's: keep one. Details in plugin/README.md.

Install

  1. Claude Code: the plugin (server, four skills, bc-code-atlas, Microsoft Learn MCP)

    One command. The plugin registers the MCP server, the bc-code-atlas server and Microsoft's Learn MCP server and ships the four skills.

    claude plugin marketplace add waldo1001/waldo.BCObservatory
  2. Claude Code: the server only

    No skills, no atlas: just the nine tools.

    claude mcp add bc-observatory -- npx -y bc-observatory@latest
  3. Claude Desktop, Cursor, Windsurf and other MCP clients

    Add the server to the client's MCP configuration (claude_desktop_config.json, .cursor/mcp.json, ...).

    {
      "mcpServers": {
        "bc-observatory": {
          "command": "npx",
          "args": [
            "-y",
            "bc-observatory@latest"
          ]
        }
      }
    }
  4. VS Code (GitHub Copilot)

    In .vscode/mcp.json of the workspace, or the user profile's mcp.json.

    {
      "servers": {
        "bc-observatory": {
          "type": "stdio",
          "command": "npx",
          "args": [
            "-y",
            "bc-observatory@latest"
          ]
        },
        "bc-code-atlas": {
          "type": "http",
          "url": "https://bc-code-atlas.stefanmaron.dev/mcp"
        },
        "microsoft-learn": {
          "type": "http",
          "url": "https://learn.microsoft.com/api/mcp"
        }
      }
    }
  5. From a checkout of the repository

    Reads every page from disk instead of the site; for working on the knowledge base itself.

    git clone https://github.com/waldo1001/waldo.BCObservatory.git && cd waldo.BCObservatory && npm ci
    claude mcp add bc-observatory -- env BC_OBSERVATORY_LOCAL=$PWD node --import tsx packages/mcp/src/server.ts
  6. Without any install

    llms.txt lists every section; every page has a markdown twin at its URL plus .md; GitMCP and DeepWiki (badges in the README) read the repository directly.

How it answers

The server fetches the search index from this site over HTTPS and caches it by hash in ~/.cache/bc-observatory/, refreshed daily, and reads a page's markdown twin when you ask for it; a page over 30,000 characters comes back as a compact view with its section keys. Search is hybrid: keywords plus a small static embedding model (model2vec potion-base-8M, 30 MB, downloaded once and checked by SHA-256) computed locally; BC_OBSERVATORY_EMBEDDINGS=0 turns the model off. BC_OBSERVATORY_LOCAL reads a checkout instead, BC_OBSERVATORY_SITE points at another deployment. Nothing is sent anywhere: feedback only returns a link you open yourself.

Needs Node 20 or newer. Source: packages/mcp and plugin, MIT. The endpoints the plugin connects: https://bc-code-atlas.stefanmaron.dev/mcp (atlas), https://learn.microsoft.com/api/mcp (Microsoft Learn).