@framedash/mcp-server 0.1.0 → 0.1.2
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 +3 -3
- package/dist/api.d.ts +31 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +37 -0
- package/dist/api.js.map +1 -0
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +148 -12
- package/dist/helpers.js.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/resources.d.ts.map +1 -1
- package/dist/resources.js +4 -3
- package/dist/resources.js.map +1 -1
- package/dist/server.d.ts +9 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +10 -2
- package/dist/server.js.map +1 -1
- package/dist/tools/analytics.d.ts +1 -1
- package/dist/tools/analytics.d.ts.map +1 -1
- package/dist/tools/analytics.js +22 -35
- package/dist/tools/analytics.js.map +1 -1
- package/dist/tools/project.d.ts.map +1 -1
- package/dist/tools/project.js +6 -7
- package/dist/tools/project.js.map +1 -1
- package/package.json +53 -44
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ Add to your `claude_desktop_config.json`:
|
|
|
15
15
|
"command": "npx",
|
|
16
16
|
"args": ["@framedash/mcp-server"],
|
|
17
17
|
"env": {
|
|
18
|
-
"FRAMEDASH_API_KEY": "
|
|
18
|
+
"FRAMEDASH_API_KEY": "fd_xxx",
|
|
19
19
|
"FRAMEDASH_PROJECT_ID": "your-project-uuid"
|
|
20
20
|
}
|
|
21
21
|
}
|
|
@@ -34,7 +34,7 @@ Add to your VS Code settings:
|
|
|
34
34
|
"command": "npx",
|
|
35
35
|
"args": ["@framedash/mcp-server"],
|
|
36
36
|
"env": {
|
|
37
|
-
"FRAMEDASH_API_KEY": "
|
|
37
|
+
"FRAMEDASH_API_KEY": "fd_xxx",
|
|
38
38
|
"FRAMEDASH_PROJECT_ID": "your-project-uuid"
|
|
39
39
|
}
|
|
40
40
|
}
|
|
@@ -46,7 +46,7 @@ Add to your VS Code settings:
|
|
|
46
46
|
|
|
47
47
|
| Variable | Required | Description |
|
|
48
48
|
|----------|----------|-------------|
|
|
49
|
-
| `FRAMEDASH_API_KEY` | Yes |
|
|
49
|
+
| `FRAMEDASH_API_KEY` | Yes | API key with `analytics:read` for the aggregate tools; the raw `query` tool additionally requires `data:admin` |
|
|
50
50
|
| `FRAMEDASH_PROJECT_ID` | No | Default project UUID for project-scoped tools |
|
|
51
51
|
| `FRAMEDASH_BASE_URL` | No | API base URL (default: `https://app.framedash.dev`) |
|
|
52
52
|
|
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin fetch helpers shared by resources.ts and tools/project.ts so each
|
|
3
|
+
* endpoint path is defined in exactly one place.
|
|
4
|
+
*
|
|
5
|
+
* The fetchProject* helpers hit project-scoped routes via
|
|
6
|
+
* ApiClient.projectPath(); fetchContent hits the global /api/v1/content
|
|
7
|
+
* list (path built by the api-client buildContentPath builder) -- pass a
|
|
8
|
+
* projectClient-derived client to scope it via the X-Project-Id header.
|
|
9
|
+
*/
|
|
10
|
+
import { type ApiClient } from "@framedash/api-client";
|
|
11
|
+
/**
|
|
12
|
+
* Fetch project status (/api/v1/projects/{id}/status).
|
|
13
|
+
*/
|
|
14
|
+
export declare function fetchProjectStatus(client: ApiClient): Promise<unknown>;
|
|
15
|
+
/**
|
|
16
|
+
* Fetch project maps (/api/v1/projects/{id}/maps).
|
|
17
|
+
*/
|
|
18
|
+
export declare function fetchProjectMaps(client: ApiClient): Promise<unknown>;
|
|
19
|
+
/**
|
|
20
|
+
* Fetch project-scoped content (/api/v1/projects/{id}/content).
|
|
21
|
+
* Distinct from the global /api/v1/content list (fetchContent below).
|
|
22
|
+
*/
|
|
23
|
+
export declare function fetchProjectContent(client: ApiClient): Promise<unknown>;
|
|
24
|
+
/**
|
|
25
|
+
* Fetch content registry entries (/api/v1/content).
|
|
26
|
+
* type is an optional filter.
|
|
27
|
+
*/
|
|
28
|
+
export declare function fetchContent(apiClient: ApiClient, opts?: {
|
|
29
|
+
type?: string;
|
|
30
|
+
}): Promise<unknown>;
|
|
31
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,uBAAuB,CAAC;AAEzE;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAE5E;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAE1E;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAE7E;AAED;;;GAGG;AACH,wBAAsB,YAAY,CACjC,SAAS,EAAE,SAAS,EACpB,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1B,OAAO,CAAC,OAAO,CAAC,CAElB"}
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin fetch helpers shared by resources.ts and tools/project.ts so each
|
|
3
|
+
* endpoint path is defined in exactly one place.
|
|
4
|
+
*
|
|
5
|
+
* The fetchProject* helpers hit project-scoped routes via
|
|
6
|
+
* ApiClient.projectPath(); fetchContent hits the global /api/v1/content
|
|
7
|
+
* list (path built by the api-client buildContentPath builder) -- pass a
|
|
8
|
+
* projectClient-derived client to scope it via the X-Project-Id header.
|
|
9
|
+
*/
|
|
10
|
+
import { buildContentPath } from "@framedash/api-client";
|
|
11
|
+
/**
|
|
12
|
+
* Fetch project status (/api/v1/projects/{id}/status).
|
|
13
|
+
*/
|
|
14
|
+
export async function fetchProjectStatus(client) {
|
|
15
|
+
return client.get(client.projectPath("status"));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Fetch project maps (/api/v1/projects/{id}/maps).
|
|
19
|
+
*/
|
|
20
|
+
export async function fetchProjectMaps(client) {
|
|
21
|
+
return client.get(client.projectPath("maps"));
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Fetch project-scoped content (/api/v1/projects/{id}/content).
|
|
25
|
+
* Distinct from the global /api/v1/content list (fetchContent below).
|
|
26
|
+
*/
|
|
27
|
+
export async function fetchProjectContent(client) {
|
|
28
|
+
return client.get(client.projectPath("content"));
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Fetch content registry entries (/api/v1/content).
|
|
32
|
+
* type is an optional filter.
|
|
33
|
+
*/
|
|
34
|
+
export async function fetchContent(apiClient, opts = {}) {
|
|
35
|
+
return apiClient.get(buildContentPath(opts));
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAkB,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAiB;IACzD,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAiB;IACvD,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAiB;IAC1D,OAAO,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,SAAoB,EACpB,OAA0B,EAAE;IAE5B,OAAO,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9C,CAAC"}
|
package/dist/helpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AA4KvD,+DAA+D;AAC/D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAM9C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO;;;;;EAEvC;AAED,oEAAoE;AACpE,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAEpD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO;;;;;;EAKvC;AAID,gEAAgE;AAChE,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAMpF"}
|
package/dist/helpers.js
CHANGED
|
@@ -1,20 +1,156 @@
|
|
|
1
1
|
const MAX_RESPONSE_SIZE = 50 * 1024; // 50 KB
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
const ARRAY_TRUNCATION_ROW_LIMIT = 50;
|
|
3
|
+
const ARRAY_OPEN_LENGTH = "[".length;
|
|
4
|
+
const ARRAY_CLOSE = "\n]";
|
|
5
|
+
const ARRAY_CLOSE_LENGTH = ARRAY_CLOSE.length;
|
|
6
|
+
const ARRAY_FIRST_ITEM_SEPARATOR_LENGTH = "\n".length;
|
|
7
|
+
const ARRAY_ITEM_SEPARATOR_LENGTH = ",\n".length;
|
|
8
|
+
const MIN_STRINGIFIED_ARRAY_ITEM_LENGTH = " 0".length;
|
|
9
|
+
const TRUNCATED_FOOTER_PREFIX = "\n\n[truncated: showing first ";
|
|
10
|
+
const TRUNCATED_FOOTER_MIDDLE = " rows of ";
|
|
11
|
+
const TRUNCATED_FOOTER_SUFFIX = " total]";
|
|
12
|
+
const SIMPLE_TRUNCATED_FOOTER = "\n\n[truncated]";
|
|
13
|
+
const TRUNCATED_FOOTER_STATIC_LENGTH = TRUNCATED_FOOTER_PREFIX.length + TRUNCATED_FOOTER_MIDDLE.length + TRUNCATED_FOOTER_SUFFIX.length;
|
|
14
|
+
const FALLBACK_KEEP_LENGTH = Math.max(0, MAX_RESPONSE_SIZE - SIMPLE_TRUNCATED_FOOTER.length);
|
|
15
|
+
function applyArrayItemToJSON(value, index) {
|
|
16
|
+
if (value == null || (typeof value !== "object" && typeof value !== "function"))
|
|
17
|
+
return value;
|
|
18
|
+
const toJSON = value.toJSON;
|
|
19
|
+
if (typeof toJSON !== "function")
|
|
20
|
+
return value;
|
|
21
|
+
return toJSON.call(value, String(index));
|
|
22
|
+
}
|
|
23
|
+
function createArraySlotProxy(source) {
|
|
24
|
+
const proxyTarget = Array.isArray(source) ? new Array(source.length) : {};
|
|
25
|
+
return new Proxy(proxyTarget, {
|
|
26
|
+
get(target, prop) {
|
|
27
|
+
if (prop === "toJSON")
|
|
28
|
+
return undefined;
|
|
29
|
+
if (prop === "length" && Array.isArray(target))
|
|
30
|
+
return target.length;
|
|
31
|
+
return Reflect.get(source, prop, source);
|
|
32
|
+
},
|
|
33
|
+
getOwnPropertyDescriptor(target, prop) {
|
|
34
|
+
if (prop === "toJSON")
|
|
35
|
+
return undefined;
|
|
36
|
+
if (prop === "length" && Array.isArray(target)) {
|
|
37
|
+
return Reflect.getOwnPropertyDescriptor(target, prop);
|
|
38
|
+
}
|
|
39
|
+
const descriptor = Reflect.getOwnPropertyDescriptor(source, prop);
|
|
40
|
+
if (!descriptor)
|
|
41
|
+
return undefined;
|
|
42
|
+
return { ...descriptor, configurable: true };
|
|
43
|
+
},
|
|
44
|
+
ownKeys(target) {
|
|
45
|
+
const keys = new Set([...Reflect.ownKeys(target), ...Reflect.ownKeys(source)]);
|
|
46
|
+
keys.delete("toJSON");
|
|
47
|
+
return [...keys];
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function stringifyArraySlotValue(value) {
|
|
52
|
+
if (value === undefined || typeof value === "function" || typeof value === "symbol")
|
|
53
|
+
return "null";
|
|
54
|
+
if (value == null || (typeof value !== "object" && typeof value !== "function")) {
|
|
55
|
+
return JSON.stringify(value, null, 2) ?? "null";
|
|
56
|
+
}
|
|
57
|
+
const target = value;
|
|
58
|
+
if (typeof target.toJSON !== "function")
|
|
59
|
+
return JSON.stringify(value, null, 2) ?? "null";
|
|
60
|
+
return JSON.stringify(createArraySlotProxy(value), null, 2) ?? "null";
|
|
61
|
+
}
|
|
62
|
+
function stringifyArrayItem(value, index) {
|
|
63
|
+
const text = stringifyArraySlotValue(applyArrayItemToJSON(value, index));
|
|
64
|
+
return text.replace(/^/gm, " ");
|
|
65
|
+
}
|
|
66
|
+
function truncatedArrayFooterLength(keep, total) {
|
|
67
|
+
return TRUNCATED_FOOTER_STATIC_LENGTH + String(keep).length + String(total).length;
|
|
68
|
+
}
|
|
69
|
+
function truncatedArrayFooter(keep, total) {
|
|
70
|
+
return `${TRUNCATED_FOOTER_PREFIX}${keep}${TRUNCATED_FOOTER_MIDDLE}${total}${TRUNCATED_FOOTER_SUFFIX}`;
|
|
71
|
+
}
|
|
72
|
+
function minimumFullArrayLength(fullLength, currentIndex, total) {
|
|
73
|
+
const remainingItems = Math.max(0, total - currentIndex);
|
|
74
|
+
if (remainingItems === 0)
|
|
75
|
+
return fullLength + ARRAY_CLOSE_LENGTH;
|
|
76
|
+
const firstSeparatorLength = currentIndex === 0 ? ARRAY_FIRST_ITEM_SEPARATOR_LENGTH : ARRAY_ITEM_SEPARATOR_LENGTH;
|
|
77
|
+
return (fullLength +
|
|
78
|
+
firstSeparatorLength +
|
|
79
|
+
MIN_STRINGIFIED_ARRAY_ITEM_LENGTH +
|
|
80
|
+
(remainingItems - 1) * (ARRAY_ITEM_SEPARATOR_LENGTH + MIN_STRINGIFIED_ARRAY_ITEM_LENGTH) +
|
|
81
|
+
ARRAY_CLOSE_LENGTH);
|
|
82
|
+
}
|
|
83
|
+
function truncateArrayFallback(firstItem) {
|
|
84
|
+
const text = `[\n${firstItem}`;
|
|
85
|
+
return `${text.slice(0, FALLBACK_KEEP_LENGTH)}${SIMPLE_TRUNCATED_FOOTER}`;
|
|
86
|
+
}
|
|
87
|
+
function stringifyArrayForResponse(data) {
|
|
88
|
+
if (data.length === 0)
|
|
89
|
+
return "[]";
|
|
90
|
+
const fullParts = ["["];
|
|
91
|
+
const prefixParts = ["["];
|
|
92
|
+
let fullLength = ARRAY_OPEN_LENGTH;
|
|
93
|
+
let prefixLength = ARRAY_OPEN_LENGTH;
|
|
94
|
+
let prefixKeep = 0;
|
|
95
|
+
let firstItem = "";
|
|
96
|
+
let canAppendToPrefix = true;
|
|
97
|
+
const total = data.length;
|
|
98
|
+
for (let i = 0; i < total; i++) {
|
|
99
|
+
const cannotFitFullArray = (i >= ARRAY_TRUNCATION_ROW_LIMIT || !canAppendToPrefix) &&
|
|
100
|
+
minimumFullArrayLength(fullLength, i, total) > MAX_RESPONSE_SIZE;
|
|
101
|
+
if (cannotFitFullArray) {
|
|
102
|
+
if (prefixKeep > 0) {
|
|
103
|
+
prefixParts.push(ARRAY_CLOSE);
|
|
104
|
+
return `${prefixParts.join("")}${truncatedArrayFooter(prefixKeep, total)}`;
|
|
105
|
+
}
|
|
106
|
+
return truncateArrayFallback(firstItem);
|
|
107
|
+
}
|
|
108
|
+
const separator = i === 0 ? "\n" : ",\n";
|
|
109
|
+
const item = stringifyArrayItem(data[i], i);
|
|
110
|
+
if (i === 0)
|
|
111
|
+
firstItem = item;
|
|
112
|
+
if (canAppendToPrefix && i < ARRAY_TRUNCATION_ROW_LIMIT) {
|
|
113
|
+
const nextKeep = i + 1;
|
|
114
|
+
const nextPrefixLength = prefixLength +
|
|
115
|
+
separator.length +
|
|
116
|
+
item.length +
|
|
117
|
+
ARRAY_CLOSE_LENGTH +
|
|
118
|
+
truncatedArrayFooterLength(nextKeep, total);
|
|
119
|
+
if (nextPrefixLength <= MAX_RESPONSE_SIZE) {
|
|
120
|
+
prefixParts.push(separator, item);
|
|
121
|
+
prefixLength += separator.length + item.length;
|
|
122
|
+
prefixKeep = nextKeep;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
canAppendToPrefix = false;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const nextFullLength = fullLength + separator.length + item.length + ARRAY_CLOSE_LENGTH;
|
|
129
|
+
if (nextFullLength > MAX_RESPONSE_SIZE) {
|
|
130
|
+
if (prefixKeep > 0) {
|
|
131
|
+
prefixParts.push(ARRAY_CLOSE);
|
|
132
|
+
return `${prefixParts.join("")}${truncatedArrayFooter(prefixKeep, total)}`;
|
|
133
|
+
}
|
|
134
|
+
return truncateArrayFallback(firstItem);
|
|
135
|
+
}
|
|
136
|
+
fullParts.push(separator, item);
|
|
137
|
+
fullLength += separator.length + item.length;
|
|
138
|
+
}
|
|
139
|
+
fullParts.push(ARRAY_CLOSE);
|
|
140
|
+
return fullParts.join("");
|
|
141
|
+
}
|
|
142
|
+
function stringifyAndTruncate(data) {
|
|
4
143
|
const text = JSON.stringify(data, null, 2) ?? "null";
|
|
5
144
|
if (text.length <= MAX_RESPONSE_SIZE)
|
|
6
145
|
return text;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
return slice + footer;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
146
|
+
return `${text.slice(0, FALLBACK_KEEP_LENGTH)}${SIMPLE_TRUNCATED_FOOTER}`;
|
|
147
|
+
}
|
|
148
|
+
/** Truncate large responses to protect LLM context windows. */
|
|
149
|
+
export function truncate(data) {
|
|
150
|
+
if (Array.isArray(data) && typeof data.toJSON !== "function") {
|
|
151
|
+
return stringifyArrayForResponse(data);
|
|
16
152
|
}
|
|
17
|
-
return
|
|
153
|
+
return stringifyAndTruncate(data);
|
|
18
154
|
}
|
|
19
155
|
export function textResult(data) {
|
|
20
156
|
return { content: [{ type: "text", text: truncate(data) }] };
|
package/dist/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAEA,MAAM,iBAAiB,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,QAAQ;
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
2
3
|
import { ApiClient } from "@framedash/api-client";
|
|
3
4
|
import { createServer } from "./server.js";
|
|
4
5
|
import { StrictStdioServerTransport } from "./transport.js";
|
|
6
|
+
// Source the handshake version from package.json (same approach as the CLI) so
|
|
7
|
+
// the advertised server version cannot drift from the published package.
|
|
8
|
+
const VERSION = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"))
|
|
9
|
+
.version;
|
|
5
10
|
const apiKey = process.env.FRAMEDASH_API_KEY;
|
|
6
11
|
if (!apiKey) {
|
|
7
12
|
process.stderr.write("Error: FRAMEDASH_API_KEY environment variable is required\n");
|
|
@@ -21,7 +26,7 @@ try {
|
|
|
21
26
|
throw err;
|
|
22
27
|
},
|
|
23
28
|
});
|
|
24
|
-
const server = createServer(client);
|
|
29
|
+
const server = createServer(client, VERSION);
|
|
25
30
|
const transport = new StrictStdioServerTransport();
|
|
26
31
|
await server.connect(transport);
|
|
27
32
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAE5D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;AAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;IACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC;AACzD,IAAI,CAAC,SAAS,EAAE,CAAC;IAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB,sGAAsG,CACtG,CAAC;AACH,CAAC;AACD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,2BAA2B,CAAC;AAE9E,IAAI,CAAC;IACJ,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC5B,OAAO;QACP,MAAM;QACN,SAAS;QACT,OAAO,CAAC,GAAG;YACV,MAAM,GAAG,CAAC;QACX,CAAC;KACD,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAE5D,+EAA+E;AAC/E,yEAAyE;AACzE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;KAC3F,OAAiB,CAAC;AAEpB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;AAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;IACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC;AACzD,IAAI,CAAC,SAAS,EAAE,CAAC;IAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB,sGAAsG,CACtG,CAAC;AACH,CAAC;AACD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,2BAA2B,CAAC;AAE9E,IAAI,CAAC;IACJ,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC5B,OAAO;QACP,MAAM;QACN,SAAS;QACT,OAAO,CAAC,GAAG;YACV,MAAM,GAAG,CAAC;QACX,CAAC;KACD,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,0BAA0B,EAAE,CAAC;IACnD,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,GAAG,IAAI,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC"}
|
package/dist/resources.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AAI3F,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CA+E/E"}
|
package/dist/resources.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { fetchProjectContent, fetchProjectMaps, fetchProjectStatus } from "./api.js";
|
|
2
3
|
import { getErrorMessage, projectClient, truncate } from "./helpers.js";
|
|
3
4
|
export function registerResources(server, apiClient) {
|
|
4
5
|
server.registerResource("projects", "framedash://projects", {
|
|
@@ -22,7 +23,7 @@ export function registerResources(server, apiClient) {
|
|
|
22
23
|
}, async (uri, params) => {
|
|
23
24
|
try {
|
|
24
25
|
const client = projectClient(apiClient, String(params.projectId));
|
|
25
|
-
const data = await
|
|
26
|
+
const data = await fetchProjectMaps(client);
|
|
26
27
|
return { contents: [{ uri: uri.href, text: truncate(data) }] };
|
|
27
28
|
}
|
|
28
29
|
catch (err) {
|
|
@@ -37,7 +38,7 @@ export function registerResources(server, apiClient) {
|
|
|
37
38
|
}, async (uri, params) => {
|
|
38
39
|
try {
|
|
39
40
|
const client = projectClient(apiClient, String(params.projectId));
|
|
40
|
-
const data = await
|
|
41
|
+
const data = await fetchProjectContent(client);
|
|
41
42
|
return { contents: [{ uri: uri.href, text: truncate(data) }] };
|
|
42
43
|
}
|
|
43
44
|
catch (err) {
|
|
@@ -52,7 +53,7 @@ export function registerResources(server, apiClient) {
|
|
|
52
53
|
}, async (uri, params) => {
|
|
53
54
|
try {
|
|
54
55
|
const client = projectClient(apiClient, String(params.projectId));
|
|
55
|
-
const data = await
|
|
56
|
+
const data = await fetchProjectStatus(client);
|
|
56
57
|
return { contents: [{ uri: uri.href, text: truncate(data) }] };
|
|
57
58
|
}
|
|
58
59
|
catch (err) {
|
package/dist/resources.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExE,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,SAAoB;IACxE,MAAM,CAAC,gBAAgB,CACtB,UAAU,EACV,sBAAsB,EACtB;QACC,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,sCAAsC;QACnD,QAAQ,EAAE,kBAAkB;KAC5B,EACD,KAAK,IAAI,EAAE;QACV,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YACrD,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,sBAAsB,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC9E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;YACjC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,sBAAsB,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QACnE,CAAC;IACF,CAAC,CACD,CAAC;IAEF,MAAM,CAAC,gBAAgB,CACtB,cAAc,EACd,IAAI,gBAAgB,CAAC,uCAAuC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAClF;QACC,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,oCAAoC;QACjD,QAAQ,EAAE,kBAAkB;KAC5B,EACD,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QACrB,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YAClE,MAAM,IAAI,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
import type { ApiClient } from "@framedash/api-client";
|
|
2
2
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Build the Framedash MCP server around an ApiClient. `version` is the
|
|
5
|
+
* handshake version advertised to clients; hosts source it from this
|
|
6
|
+
* package's package.json (the stdio bin reads it with fs at boot, the hosted
|
|
7
|
+
* HTTP endpoint imports the JSON at build time) so it cannot drift from the
|
|
8
|
+
* published package. Keeping the fs read OUT of this module makes it
|
|
9
|
+
* bundler-safe for the Next.js remote endpoint.
|
|
10
|
+
*/
|
|
11
|
+
export declare function createServer(apiClient: ApiClient, version: string): McpServer;
|
|
4
12
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,wBAAgB,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAa7E"}
|
package/dist/server.js
CHANGED
|
@@ -4,10 +4,18 @@ import { registerAlertTools } from "./tools/alerts.js";
|
|
|
4
4
|
import { registerAnalyticsTools } from "./tools/analytics.js";
|
|
5
5
|
import { registerProjectTools } from "./tools/project.js";
|
|
6
6
|
import { registerQueryTools } from "./tools/query.js";
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* Build the Framedash MCP server around an ApiClient. `version` is the
|
|
9
|
+
* handshake version advertised to clients; hosts source it from this
|
|
10
|
+
* package's package.json (the stdio bin reads it with fs at boot, the hosted
|
|
11
|
+
* HTTP endpoint imports the JSON at build time) so it cannot drift from the
|
|
12
|
+
* published package. Keeping the fs read OUT of this module makes it
|
|
13
|
+
* bundler-safe for the Next.js remote endpoint.
|
|
14
|
+
*/
|
|
15
|
+
export function createServer(apiClient, version) {
|
|
8
16
|
const server = new McpServer({
|
|
9
17
|
name: "framedash",
|
|
10
|
-
version
|
|
18
|
+
version,
|
|
11
19
|
});
|
|
12
20
|
registerQueryTools(server, apiClient);
|
|
13
21
|
registerAnalyticsTools(server, apiClient);
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,UAAU,YAAY,CAAC,SAAoB;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,SAAoB,EAAE,OAAe;IACjE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC5B,IAAI,EAAE,WAAW;QACjB,OAAO;KACP,CAAC,CAAC;IAEH,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,sBAAsB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC1C,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACxC,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAErC,OAAO,MAAM,CAAC;AACf,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ApiClient } from "@framedash/api-client";
|
|
2
2
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
3
|
export declare function registerAnalyticsTools(server: McpServer, apiClient: ApiClient): void;
|
|
4
4
|
//# sourceMappingURL=analytics.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/tools/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/tools/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,SAAS,EAMd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiCzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CA8IpF"}
|
package/dist/tools/analytics.js
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
|
+
import { buildDashboardPath, buildFunnelPath, buildHeatmapPath, buildInsightsPath, buildRetentionPath, } from "@framedash/api-client";
|
|
1
2
|
import { z } from "zod";
|
|
2
3
|
import { errorResult, projectClient, textResult } from "../helpers.js";
|
|
3
4
|
// The REST API rejects values outside these sets with HTTP 400. They mirror the
|
|
4
5
|
// web app's constants (ALLOWED_DAYS / ALLOWED_LIMITS in lib/analytics/constants,
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// instead of after a server
|
|
6
|
+
// ALLOWED_WINDOW_SECONDS in the funnels route, VALID_DAYS / VALID_CELL_SIZES in
|
|
7
|
+
// lib/heatmap-constants). The MCP server is a separate package and cannot import
|
|
8
|
+
// them, so keep these in sync if the API changes. Constraining the input schema
|
|
9
|
+
// lets the MCP client reject invalid values up front instead of after a server
|
|
10
|
+
// round-trip.
|
|
9
11
|
const ANALYTICS_DAYS = [7, 14, 30, 90];
|
|
10
12
|
const INSIGHTS_LIMITS = [10, 20, 50];
|
|
13
|
+
const FUNNEL_WINDOWS = [3600, 21600, 86400, 604800];
|
|
11
14
|
const HEATMAP_DAYS = [1, 7, 14, 30];
|
|
12
15
|
const HEATMAP_CELL_SIZES = [5, 10, 25, 50];
|
|
13
16
|
/**
|
|
@@ -32,11 +35,7 @@ export function registerAnalyticsTools(server, apiClient) {
|
|
|
32
35
|
}, async (args) => {
|
|
33
36
|
try {
|
|
34
37
|
const client = projectClient(apiClient, args.project_id);
|
|
35
|
-
const
|
|
36
|
-
if (args.days)
|
|
37
|
-
params.set("days", String(args.days));
|
|
38
|
-
const qs = params.toString() ? `?${params}` : "";
|
|
39
|
-
const data = await client.get(client.projectPath(`dashboard${qs}`));
|
|
38
|
+
const data = await client.get(client.projectPath(buildDashboardPath({ days: args.days })));
|
|
40
39
|
return textResult(data);
|
|
41
40
|
}
|
|
42
41
|
catch (err) {
|
|
@@ -53,11 +52,7 @@ export function registerAnalyticsTools(server, apiClient) {
|
|
|
53
52
|
}, async (args) => {
|
|
54
53
|
try {
|
|
55
54
|
const client = projectClient(apiClient, args.project_id);
|
|
56
|
-
const
|
|
57
|
-
if (args.days)
|
|
58
|
-
params.set("days", String(args.days));
|
|
59
|
-
const qs = params.toString() ? `?${params}` : "";
|
|
60
|
-
const data = await client.get(client.projectPath(`retention${qs}`));
|
|
55
|
+
const data = await client.get(client.projectPath(buildRetentionPath({ days: args.days })));
|
|
61
56
|
return textResult(data);
|
|
62
57
|
}
|
|
63
58
|
catch (err) {
|
|
@@ -71,14 +66,12 @@ export function registerAnalyticsTools(server, apiClient) {
|
|
|
71
66
|
project_id: z.string().uuid().optional().describe("Override the default project ID"),
|
|
72
67
|
steps: z.string().describe("Comma-separated event names (2-8 steps)"),
|
|
73
68
|
days: allowedIntEnum(ANALYTICS_DAYS, "Time period: 7, 14, 30, or 90 days (default 30)"),
|
|
69
|
+
window: allowedIntEnum(FUNNEL_WINDOWS, "Conversion window in seconds: 3600, 21600, 86400, or 604800 (default 86400)"),
|
|
74
70
|
},
|
|
75
71
|
}, async (args) => {
|
|
76
72
|
try {
|
|
77
73
|
const client = projectClient(apiClient, args.project_id);
|
|
78
|
-
const
|
|
79
|
-
if (args.days)
|
|
80
|
-
params.set("days", String(args.days));
|
|
81
|
-
const data = await client.get(client.projectPath(`funnels?${params}`));
|
|
74
|
+
const data = await client.get(client.projectPath(buildFunnelPath({ steps: args.steps, days: args.days, window: args.window })));
|
|
82
75
|
return textResult(data);
|
|
83
76
|
}
|
|
84
77
|
catch (err) {
|
|
@@ -99,17 +92,13 @@ export function registerAnalyticsTools(server, apiClient) {
|
|
|
99
92
|
}, async (args) => {
|
|
100
93
|
try {
|
|
101
94
|
const client = projectClient(apiClient, args.project_id);
|
|
102
|
-
const
|
|
95
|
+
const data = await client.get(client.projectPath(buildInsightsPath({
|
|
103
96
|
metric: args.metric,
|
|
104
97
|
groupBy: args.group_by,
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
params.set("limit", String(args.limit));
|
|
110
|
-
if (args.event_name)
|
|
111
|
-
params.set("eventName", args.event_name);
|
|
112
|
-
const data = await client.get(client.projectPath(`insights?${params}`));
|
|
98
|
+
days: args.days,
|
|
99
|
+
limit: args.limit,
|
|
100
|
+
eventName: args.event_name,
|
|
101
|
+
})));
|
|
113
102
|
return textResult(data);
|
|
114
103
|
}
|
|
115
104
|
catch (err) {
|
|
@@ -131,14 +120,12 @@ export function registerAnalyticsTools(server, apiClient) {
|
|
|
131
120
|
}, async (args) => {
|
|
132
121
|
try {
|
|
133
122
|
const client = projectClient(apiClient, args.project_id);
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
params.set("eventName", args.event_name);
|
|
141
|
-
const data = await client.get(client.projectPath(`heatmap?${params}`));
|
|
123
|
+
const data = await client.get(client.projectPath(buildHeatmapPath({
|
|
124
|
+
mapId: args.map_id,
|
|
125
|
+
cellSize: args.cell_size,
|
|
126
|
+
days: args.days,
|
|
127
|
+
eventName: args.event_name,
|
|
128
|
+
})));
|
|
142
129
|
return textResult(data);
|
|
143
130
|
}
|
|
144
131
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/tools/analytics.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/tools/analytics.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/tools/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/tools/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CA+ElF"}
|
package/dist/tools/project.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { fetchContent, fetchProjectMaps, fetchProjectStatus } from "../api.js";
|
|
2
3
|
import { errorResult, projectClient, textResult } from "../helpers.js";
|
|
3
4
|
export function registerProjectTools(server, apiClient) {
|
|
4
5
|
server.registerTool("list_projects", {
|
|
@@ -22,7 +23,7 @@ export function registerProjectTools(server, apiClient) {
|
|
|
22
23
|
}, async (args) => {
|
|
23
24
|
try {
|
|
24
25
|
const client = projectClient(apiClient, args.project_id);
|
|
25
|
-
const data = await
|
|
26
|
+
const data = await fetchProjectStatus(client);
|
|
26
27
|
return textResult(data);
|
|
27
28
|
}
|
|
28
29
|
catch (err) {
|
|
@@ -38,7 +39,7 @@ export function registerProjectTools(server, apiClient) {
|
|
|
38
39
|
}, async (args) => {
|
|
39
40
|
try {
|
|
40
41
|
const client = projectClient(apiClient, args.project_id);
|
|
41
|
-
const data = await
|
|
42
|
+
const data = await fetchProjectMaps(client);
|
|
42
43
|
return textResult(data);
|
|
43
44
|
}
|
|
44
45
|
catch (err) {
|
|
@@ -54,12 +55,10 @@ export function registerProjectTools(server, apiClient) {
|
|
|
54
55
|
},
|
|
55
56
|
}, async (args) => {
|
|
56
57
|
try {
|
|
58
|
+
// projectClient preserves the optional project_id override: the
|
|
59
|
+
// derived client sends X-Project-Id on this non-project-scoped path.
|
|
57
60
|
const client = projectClient(apiClient, args.project_id);
|
|
58
|
-
const
|
|
59
|
-
if (args.type)
|
|
60
|
-
params.set("type", args.type);
|
|
61
|
-
const qs = params.toString() ? `?${params}` : "";
|
|
62
|
-
const data = await client.get(`/api/v1/content${qs}`);
|
|
61
|
+
const data = await fetchContent(client, { type: args.type });
|
|
63
62
|
return textResult(data);
|
|
64
63
|
}
|
|
65
64
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/tools/project.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEvE,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,SAAoB;IAC3E,MAAM,CAAC,YAAY,CAClB,eAAe,EACf;QACC,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,gDAAgD;KAC7D,EACD,KAAK,IAAI,EAAE;QACV,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YACrD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACF,CAAC,CACD,CAAC;IAEF,MAAM,CAAC,YAAY,CAClB,oBAAoB,EACpB;QACC,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,oEAAoE;QACjF,WAAW,EAAE;YACZ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;SACpF;KACD,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACd,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACzD,MAAM,IAAI,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/tools/project.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,45 +1,54 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
2
|
+
"name": "@framedash/mcp-server",
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "MCP server for the Framedash analytics platform",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist"
|
|
9
|
+
],
|
|
10
|
+
"publishConfig": {
|
|
11
|
+
"access": "public"
|
|
12
|
+
},
|
|
13
|
+
"bin": {
|
|
14
|
+
"framedash-mcp": "./dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"main": "./dist/index.js",
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
|
+
"default": "./dist/index.js"
|
|
22
|
+
},
|
|
23
|
+
"./server": {
|
|
24
|
+
"types": "./dist/server.d.ts",
|
|
25
|
+
"default": "./dist/server.js"
|
|
26
|
+
},
|
|
27
|
+
"./package.json": "./package.json"
|
|
28
|
+
},
|
|
29
|
+
"scripts": {
|
|
30
|
+
"build": "tsc -p tsconfig.build.json",
|
|
31
|
+
"type-check": "tsc --noEmit",
|
|
32
|
+
"test": "vitest run",
|
|
33
|
+
"test:coverage": "vitest run --coverage",
|
|
34
|
+
"clean": "rm -rf dist"
|
|
35
|
+
},
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@framedash/api-client": "0.1.3",
|
|
38
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
39
|
+
"zod": "^4.3.6"
|
|
40
|
+
},
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=20.0.0"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/node": "^22.0.0",
|
|
46
|
+
"@vitest/coverage-v8": "^3.2.0",
|
|
47
|
+
"typescript": "^5.7.0",
|
|
48
|
+
"vitest": "^3.2.0"
|
|
49
|
+
},
|
|
50
|
+
"repository": {
|
|
51
|
+
"type": "git",
|
|
52
|
+
"url": "git+https://github.com/crane-valley/framedash-mcp-server.git"
|
|
53
|
+
}
|
|
54
|
+
}
|