bc-observatory 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -8,7 +8,7 @@ Microsoft 365 roadmap features, videos and community posts), every claim with a
8
8
  claude mcp add bc-observatory -- npx -y bc-observatory@latest
9
9
  ```
10
10
 
11
- Or the Claude Code plugin (MCP server plus skills): `claude plugin marketplace add waldo1001/waldo.BCObservatory`.
11
+ Or the Claude Code plugin (MCP server plus skills): `claude plugin marketplace add waldo1001/waldo.BCObservatory`. The server never fetches Learn pages (D01); the plugin also connects Microsoft's Learn MCP (`https://learn.microsoft.com/api/mcp`), and a Learn hit's url is read there with `microsoft_docs_fetch`.
12
12
 
13
13
  Tools: `search`, `ls`, `cat`, `get_object`, `diff_object`, `localization`, `whats_new`, `blog_footprint`, `feedback`.
14
14
 
package/dist/server.js CHANGED
@@ -463,6 +463,7 @@ var push = (m, k, v) => {
463
463
  if (l) l.push(v);
464
464
  else m.set(k, [v]);
465
465
  };
466
+ var INDEX_PAGE_IDS = 16;
466
467
  function normOf(r) {
467
468
  const cached = NORM.get(r);
468
469
  if (cached) return cached;
@@ -471,7 +472,8 @@ function normOf(r) {
471
472
  const own = r.type === "topic" ? new Set(tokenize(r.title)) : null;
472
473
  const learn = r.type === "learn";
473
474
  const tags = (r.tags ?? []).flatMap((t) => indexTokens(t, learn)).filter((t) => !own?.has(t));
474
- const eqs = r.type === "object" || symbol ? [tokenize(r.name), ...r.caption ? [tokenize(r.caption)] : []] : [tokenize(r.title), ...learn ? (r.tags ?? []).filter(isCodedId).map((t) => tokenize(t)).filter((t) => t.length === 1) : []];
475
+ const coded = learn ? [...new Set((r.tags ?? []).filter(isCodedId))] : [];
476
+ const eqs = r.type === "object" || symbol ? [tokenize(r.name), ...r.caption ? [tokenize(r.caption)] : []] : [tokenize(r.title), ...learn ? [...(r.title.match(/\b[A-Z]{2,3}\d{4}\b/g) ?? []).filter(isCodedId), ...coded.length <= INDEX_PAGE_IDS ? coded : []].map((t) => tokenize(t)).filter((t) => t.length === 1) : []];
475
477
  const n = { main: [...main], tags: learn ? tags : [...new Set(tags)], text: symbol ? null : indexTokens(r.text ?? ""), eqs };
476
478
  NORM.set(r, n);
477
479
  return n;
@@ -1569,7 +1571,7 @@ ${pageView(md, clean, {}, budget, site)}`;
1569
1571
  }
1570
1572
 
1571
1573
  // src/server.ts
1572
- var VERSION = "0.7.0";
1574
+ var VERSION = "0.7.1";
1573
1575
  var SITE = (process.env.BC_OBSERVATORY_SITE ?? "https://waldo1001.github.io/waldo.BCObservatory/").replace(/\/?$/, "/");
1574
1576
  var LOCAL = process.env.BC_OBSERVATORY_LOCAL ? resolve(process.env.BC_OBSERVATORY_LOCAL) : null;
1575
1577
  var BUDGET = budgetOf(process.env.BC_OBSERVATORY_MAX_CHARS);
@@ -1790,7 +1792,7 @@ Hint: ${h.text}${via(h)}`).join("")}`;
1790
1792
  }
1791
1793
  if (!shown.length) return `No pages match "${a.query}". Try fewer words, or ls("") to browse sections.${note}${hintText}`;
1792
1794
  const how = semantic.length && keyword.length && mode === "hybrid" ? "keyword + meaning" : mode === "semantic" && semantic.length ? "meaning" : "keyword";
1793
- const learnNote = shown.some((r) => r.type === "learn") ? "; a Learn article's url opens on learn.microsoft.com, cat(hub) reads its hub" : "";
1795
+ const learnNote = shown.some((r) => r.type === "learn") ? "; a Learn article's url reads with the Learn MCP's microsoft_docs_fetch (the plugin connects it), else open it on learn.microsoft.com; cat(hub) reads its hub" : "";
1794
1796
  if (mode === "hybrid" && !keyword.length && semantic.length) return `No keyword match for "${a.query}"; ${shown.length} pages by meaning only (read one with cat(path)${learnNote}):
1795
1797
  ${shown.map((r) => hitLine(r, tag(uid(r)))).join("\n")}${hintText}`;
1796
1798
  return `${shown.length} results, ${how}${note}${how === "keyword + meaning" ? ` (exact band: ${exactBand})` : ""} (read one with cat(path)${learnNote}):
@@ -1946,7 +1948,7 @@ ${a.message}
1946
1948
  var VIEW = { section: z.string().optional(), offset: z.number().int().min(0).max(1e5).optional(), limit: z.number().int().min(1).max(5e3).optional() };
1947
1949
  function createServer() {
1948
1950
  const server = new McpServer({ name: "bc-observatory", version: VERSION }, {
1949
- instructions: "BC Observatory: an agent-first knowledge base of Microsoft Dynamics 365 Business Central (Learn hubs, AL objects from the code for BC28-30, localizations, roadmap features, videos, community posts, code changes: merged pull requests of Microsoft's Business Central repositories, BCApps joined to the AL objects they changed, under changes/, and AL Language extension releases (the marketplace changelog, under releases/)). Every page carries a trust tier (official = Microsoft, community = everyone else) and a review state: say which tier a claim comes from. Never invent AL object ids or version numbers: look them up with get_object. Start with search(), read pages with cat(path), browse with ls(path). search() also finds Microsoft Learn articles by title, summary and the identifiers they document (type learn): those are not pages here, open their url on learn.microsoft.com."
1951
+ instructions: "BC Observatory: an agent-first knowledge base of Microsoft Dynamics 365 Business Central (Learn hubs, AL objects from the code for BC28-30, localizations, roadmap features, videos, community posts, code changes: merged pull requests of Microsoft's Business Central repositories, BCApps joined to the AL objects they changed, under changes/, and AL Language extension releases (the marketplace changelog, under releases/)). Every page carries a trust tier (official = Microsoft, community = everyone else) and a review state: say which tier a claim comes from. Never invent AL object ids or version numbers: look them up with get_object. Start with search(), read pages with cat(path), browse with ls(path). search() also finds Microsoft Learn articles by title, summary and the identifiers they document (type learn): those are not pages here: read their url with the Learn MCP's microsoft_docs_fetch (the plugin connects it), else open it on learn.microsoft.com."
1950
1952
  });
1951
1953
  server.registerTool(
1952
1954
  "search",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bc-observatory",
3
- "version": "0.7.0",
3
+ "version": "0.7.1",
4
4
  "description": "MCP server for BC Observatory: an agent-first, cross-referenced knowledge base of Microsoft Dynamics 365 Business Central (Learn, code, roadmap, videos, community blogs).",
5
5
  "type": "module",
6
6
  "bin": {