@iamjameslennon/ddb-mcp 2.3.0

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.
Files changed (66) hide show
  1. package/README.md +520 -0
  2. package/dist/auth.d.ts +3 -0
  3. package/dist/auth.d.ts.map +1 -0
  4. package/dist/auth.js +69 -0
  5. package/dist/auth.js.map +1 -0
  6. package/dist/browser.d.ts +9 -0
  7. package/dist/browser.d.ts.map +1 -0
  8. package/dist/browser.js +68 -0
  9. package/dist/browser.js.map +1 -0
  10. package/dist/cache.d.ts +18 -0
  11. package/dist/cache.d.ts.map +1 -0
  12. package/dist/cache.js +45 -0
  13. package/dist/cache.js.map +1 -0
  14. package/dist/index.d.ts +2 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +654 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/open5e.d.ts +74 -0
  19. package/dist/open5e.d.ts.map +1 -0
  20. package/dist/open5e.js +455 -0
  21. package/dist/open5e.js.map +1 -0
  22. package/dist/session-fetch.d.ts +35 -0
  23. package/dist/session-fetch.d.ts.map +1 -0
  24. package/dist/session-fetch.js +155 -0
  25. package/dist/session-fetch.js.map +1 -0
  26. package/dist/tools/campaign.d.ts +4 -0
  27. package/dist/tools/campaign.d.ts.map +1 -0
  28. package/dist/tools/campaign.js +72 -0
  29. package/dist/tools/campaign.js.map +1 -0
  30. package/dist/tools/character.d.ts +21 -0
  31. package/dist/tools/character.d.ts.map +1 -0
  32. package/dist/tools/character.js +1128 -0
  33. package/dist/tools/character.js.map +1 -0
  34. package/dist/tools/encounter.d.ts +22 -0
  35. package/dist/tools/encounter.d.ts.map +1 -0
  36. package/dist/tools/encounter.js +453 -0
  37. package/dist/tools/encounter.js.map +1 -0
  38. package/dist/tools/library.d.ts +4 -0
  39. package/dist/tools/library.d.ts.map +1 -0
  40. package/dist/tools/library.js +112 -0
  41. package/dist/tools/library.js.map +1 -0
  42. package/dist/tools/monster.d.ts +27 -0
  43. package/dist/tools/monster.d.ts.map +1 -0
  44. package/dist/tools/monster.js +378 -0
  45. package/dist/tools/monster.js.map +1 -0
  46. package/dist/tools/navigate.d.ts +5 -0
  47. package/dist/tools/navigate.d.ts.map +1 -0
  48. package/dist/tools/navigate.js +67 -0
  49. package/dist/tools/navigate.js.map +1 -0
  50. package/dist/tools/reference.d.ts +58 -0
  51. package/dist/tools/reference.d.ts.map +1 -0
  52. package/dist/tools/reference.js +850 -0
  53. package/dist/tools/reference.js.map +1 -0
  54. package/dist/tools/search.d.ts +4 -0
  55. package/dist/tools/search.d.ts.map +1 -0
  56. package/dist/tools/search.js +64 -0
  57. package/dist/tools/search.js.map +1 -0
  58. package/dist/tools/treasure.d.ts +12 -0
  59. package/dist/tools/treasure.d.ts.map +1 -0
  60. package/dist/tools/treasure.js +522 -0
  61. package/dist/tools/treasure.js.map +1 -0
  62. package/dist/utils.d.ts +5 -0
  63. package/dist/utils.d.ts.map +1 -0
  64. package/dist/utils.js +21 -0
  65. package/dist/utils.js.map +1 -0
  66. package/package.json +36 -0
@@ -0,0 +1,67 @@
1
+ import { getPage } from "../browser.js";
2
+ export async function navigate(context, url) {
3
+ const page = await getPage(context);
4
+ // Only allow D&D Beyond URLs — validate the actual hostname to prevent subdomain spoofing.
5
+ let validatedUrl;
6
+ try {
7
+ validatedUrl = new URL(url);
8
+ }
9
+ catch {
10
+ throw new Error("Invalid URL.");
11
+ }
12
+ const h = validatedUrl.hostname;
13
+ if (validatedUrl.protocol !== "https:" || !(h === "dndbeyond.com" || h.endsWith(".dndbeyond.com"))) {
14
+ throw new Error("Only D&D Beyond URLs (https://www.dndbeyond.com/...) are supported.");
15
+ }
16
+ await page.goto(url, { waitUntil: "networkidle", timeout: 30000 });
17
+ // Extract page text content and convert to readable markdown-ish format
18
+ const content = await page.evaluate(() => {
19
+ // Remove scripts and styles
20
+ document.querySelectorAll("script, style, nav, footer, .ad-container, .advertisement").forEach((el) => el.remove());
21
+ // Try to get the main content area
22
+ const main = document.querySelector("main, article, .main-content, .page-content, #content") ?? document.body;
23
+ return main.innerText;
24
+ });
25
+ const truncated = content.length > 8000 ? content.slice(0, 8000) + "\n\n[Content truncated — use ddb_read_book or a more specific URL to get full content]" : content;
26
+ return `URL: ${url}\n\n${truncated}`;
27
+ }
28
+ export async function interact(context, action, selector, value) {
29
+ const page = await getPage(context);
30
+ switch (action) {
31
+ case "click": {
32
+ // Filter to visible elements before .first() — prevents matching hidden
33
+ // nav dropdown links that appear earlier in the DOM than the intended target.
34
+ const locator = page.locator(selector).filter({ visible: true }).first();
35
+ await locator.waitFor({ state: "visible", timeout: 10000 });
36
+ await locator.click();
37
+ await page.waitForTimeout(1000);
38
+ return `Clicked element: ${selector}`;
39
+ }
40
+ case "fill": {
41
+ if (value === undefined)
42
+ throw new Error("'value' is required for fill action.");
43
+ await page.locator(selector).first().fill(value);
44
+ await page.waitForTimeout(500);
45
+ return `Filled '${selector}'.`;
46
+ }
47
+ case "screenshot": {
48
+ const screenshotPath = `${process.env.HOME}/Downloads/ddb-screenshot-${Date.now()}.png`;
49
+ await page.screenshot({ path: screenshotPath, fullPage: false });
50
+ return `Screenshot saved to: ${screenshotPath}`;
51
+ }
52
+ default:
53
+ throw new Error(`Unknown action: ${action}. Use 'click', 'fill', or 'screenshot'.`);
54
+ }
55
+ }
56
+ export async function getCurrentPageContent(context) {
57
+ const page = await getPage(context);
58
+ const url = page.url();
59
+ const content = await page.evaluate(() => {
60
+ document.querySelectorAll("script, style, nav, footer, .ad-container").forEach((el) => el.remove());
61
+ const main = document.querySelector("main, article, .main-content, .page-content") ?? document.body;
62
+ return main.innerText;
63
+ });
64
+ const truncated = content.length > 8000 ? content.slice(0, 8000) + "\n[truncated]" : content;
65
+ return `Current URL: ${url}\n\n${truncated}`;
66
+ }
67
+ //# sourceMappingURL=navigate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigate.js","sourceRoot":"","sources":["../../src/tools/navigate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * reference.ts — Game reference tools: conditions, spells, items
3
+ *
4
+ * Conditions: hardcoded lookup table, no API required.
5
+ * Spells: built from character-service always-known/prepared endpoints
6
+ * across all 8 spellcasting classes; cached 24 h.
7
+ * Items: single game-data/items endpoint; cached 24 h.
8
+ *
9
+ * All character-service endpoints use the cobalt Bearer token.
10
+ */
11
+ export declare function getCondition(conditionName: string): string;
12
+ /**
13
+ * Supplements the spell compendium with spells from a parsed character's
14
+ * classSpells array. Captures cantrips and chosen spells absent from the
15
+ * always-known endpoints. Called from parseCharacterData().
16
+ */
17
+ export declare function addCharacterSpellsToCompendium(char: Record<string, unknown>): void;
18
+ export declare function searchSpells(params: {
19
+ name?: string;
20
+ level?: number;
21
+ school?: string;
22
+ concentration?: boolean;
23
+ ritual?: boolean;
24
+ limit?: number;
25
+ offset?: number;
26
+ }): Promise<string>;
27
+ export declare function getSpell(spellName: string): Promise<string>;
28
+ export declare function searchItems(params: {
29
+ name?: string;
30
+ rarity?: string;
31
+ type?: string;
32
+ }): Promise<string>;
33
+ export declare function getItem(itemName: string): Promise<string>;
34
+ export declare function searchRaces(name?: string, limit?: number, offset?: number): Promise<string>;
35
+ export declare function searchClasses(name?: string, limit?: number, offset?: number): Promise<string>;
36
+ export declare function searchBackgrounds(name?: string, limit?: number, offset?: number): Promise<string>;
37
+ export declare function searchFeats(params: {
38
+ name?: string;
39
+ prerequisite?: string;
40
+ limit?: number;
41
+ offset?: number;
42
+ }): Promise<string>;
43
+ export declare function searchClassFeatures(params: {
44
+ name?: string;
45
+ className?: string;
46
+ level?: number;
47
+ limit?: number;
48
+ offset?: number;
49
+ }): Promise<string>;
50
+ export declare function searchRacialTraits(params: {
51
+ name?: string;
52
+ raceName?: string;
53
+ limit?: number;
54
+ offset?: number;
55
+ }): Promise<string>;
56
+ export declare function searchRules(query?: string): Promise<string>;
57
+ export declare function getRule(nameOrSlug: string, maxChars?: number, query?: string): Promise<string>;
58
+ //# sourceMappingURL=reference.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reference.d.ts","sourceRoot":"","sources":["../../src/tools/reference.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAkKH,wBAAgB,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CA0B1D;AAsID;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CA0BlF;AAmDD,wBAAsB,YAAY,CAAC,MAAM,EAAE;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4DlB;AAED,wBAAsB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBjE;AA2FD,wBAAsB,WAAW,CAAC,MAAM,EAAE;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,MAAM,CAAC,CAuClB;AAED,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA2B/D;AA4CD,wBAAsB,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmDjG;AAmBD,wBAAsB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqDnG;AAYD,wBAAsB,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA8CvG;AAcD,wBAAsB,WAAW,CAAC,MAAM,EAAE;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,MAAM,CAAC,CAoDlB;AAgBD,wBAAsB,mBAAmB,CAAC,MAAM,EAAE;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuDlB;AAeD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwDlB;AAMD,wBAAsB,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEjE;AAED,wBAAsB,OAAO,CAC3B,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAMjB"}