@tinybirdco/devtools-mcp 0.0.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.
Files changed (38) hide show
  1. package/README.md +330 -0
  2. package/dist/config.d.ts +66 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +260 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/index.d.ts +9 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +20 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/server.d.ts +14 -0
  11. package/dist/server.d.ts.map +1 -0
  12. package/dist/server.js +37 -0
  13. package/dist/server.js.map +1 -0
  14. package/dist/tools/execute-query.d.ts +11 -0
  15. package/dist/tools/execute-query.d.ts.map +1 -0
  16. package/dist/tools/execute-query.js +38 -0
  17. package/dist/tools/execute-query.js.map +1 -0
  18. package/dist/tools/get-resource.d.ts +11 -0
  19. package/dist/tools/get-resource.d.ts.map +1 -0
  20. package/dist/tools/get-resource.js +67 -0
  21. package/dist/tools/get-resource.js.map +1 -0
  22. package/dist/tools/list-branches.d.ts +11 -0
  23. package/dist/tools/list-branches.d.ts.map +1 -0
  24. package/dist/tools/list-branches.js +41 -0
  25. package/dist/tools/list-branches.js.map +1 -0
  26. package/dist/tools/list-kafka-topics.d.ts +11 -0
  27. package/dist/tools/list-kafka-topics.d.ts.map +1 -0
  28. package/dist/tools/list-kafka-topics.js +46 -0
  29. package/dist/tools/list-kafka-topics.js.map +1 -0
  30. package/dist/tools/list-resources.d.ts +11 -0
  31. package/dist/tools/list-resources.d.ts.map +1 -0
  32. package/dist/tools/list-resources.js +99 -0
  33. package/dist/tools/list-resources.js.map +1 -0
  34. package/dist/tools/preview-kafka-topic.d.ts +11 -0
  35. package/dist/tools/preview-kafka-topic.d.ts.map +1 -0
  36. package/dist/tools/preview-kafka-topic.js +93 -0
  37. package/dist/tools/preview-kafka-topic.js.map +1 -0
  38. package/package.json +38 -0
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Tinybird DevTools MCP Server Entry Point
4
+ *
5
+ * Runs using stdio transport for MCP communication.
6
+ * Load .env files before starting the server.
7
+ */
8
+ import { config } from "dotenv";
9
+ // Load .env files in priority order
10
+ config({ path: ".env.local" });
11
+ config({ path: ".env" });
12
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
13
+ import { createMcpServer } from "./server.js";
14
+ async function main() {
15
+ const server = createMcpServer();
16
+ const transport = new StdioServerTransport();
17
+ await server.connect(transport);
18
+ }
19
+ main().catch(console.error);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,oCAAoC;AACpC,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;AAC/B,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAEzB,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Tinybird DevTools MCP Server
3
+ * Provides tools for LLMs to interact with Tinybird during development
4
+ */
5
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ /**
7
+ * Create and configure the MCP server
8
+ *
9
+ * Loads configuration from tinybird.json and registers all available tools.
10
+ *
11
+ * @returns Configured MCP server instance
12
+ */
13
+ export declare function createMcpServer(): McpServer;
14
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUpE;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,SAAS,CAkB3C"}
package/dist/server.js ADDED
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Tinybird DevTools MCP Server
3
+ * Provides tools for LLMs to interact with Tinybird during development
4
+ */
5
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import { loadConfig } from "./config.js";
7
+ import { registerExecuteQueryTool } from "./tools/execute-query.js";
8
+ import { registerListKafkaTopicsTool } from "./tools/list-kafka-topics.js";
9
+ import { registerPreviewKafkaTopicTool } from "./tools/preview-kafka-topic.js";
10
+ import { registerListResourcesTool } from "./tools/list-resources.js";
11
+ import { registerGetResourceTool } from "./tools/get-resource.js";
12
+ import { registerListBranchesTool } from "./tools/list-branches.js";
13
+ import pkg from "../package.json" with { type: "json" };
14
+ /**
15
+ * Create and configure the MCP server
16
+ *
17
+ * Loads configuration from tinybird.json and registers all available tools.
18
+ *
19
+ * @returns Configured MCP server instance
20
+ */
21
+ export function createMcpServer() {
22
+ const server = new McpServer({
23
+ name: "tinybird-devtools-mcp",
24
+ version: pkg.version,
25
+ });
26
+ // Load config from tinybird.json
27
+ const config = loadConfig();
28
+ // Register tools
29
+ registerExecuteQueryTool(server, config);
30
+ registerListResourcesTool(server, config);
31
+ registerGetResourceTool(server, config);
32
+ registerListBranchesTool(server, config);
33
+ registerListKafkaTopicsTool(server, config);
34
+ registerPreviewKafkaTopicTool(server, config);
35
+ return server;
36
+ }
37
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AAEvD;;;;;;GAMG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,uBAAuB;QAC7B,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC,CAAC;IAEH,iCAAiC;IACjC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,iBAAiB;IACjB,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,6BAA6B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE9C,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Execute Query Tool
3
+ * Executes SQL queries against Tinybird's /v0/sql endpoint
4
+ */
5
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import type { ResolvedConfig } from "../config.js";
7
+ /**
8
+ * Register the execute_query tool
9
+ */
10
+ export declare function registerExecuteQueryTool(server: McpServer, config: ResolvedConfig): void;
11
+ //# sourceMappingURL=execute-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute-query.d.ts","sourceRoot":"","sources":["../../src/tools/execute-query.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,cAAc,GACrB,IAAI,CAoCN"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Execute Query Tool
3
+ * Executes SQL queries against Tinybird's /v0/sql endpoint
4
+ */
5
+ import { z } from "zod";
6
+ /**
7
+ * Register the execute_query tool
8
+ */
9
+ export function registerExecuteQueryTool(server, config) {
10
+ server.tool("execute_query", "Execute a SQL query against Tinybird. Use this to query datasources, test SQL, or explore data.", {
11
+ query: z.string().describe("The SQL query to execute"),
12
+ }, async ({ query }) => {
13
+ const url = `${config.baseUrl}/v0/sql?q=${encodeURIComponent(query)}`;
14
+ const response = await fetch(url, {
15
+ method: "GET",
16
+ headers: {
17
+ Authorization: `Bearer ${config.token}`,
18
+ },
19
+ });
20
+ if (!response.ok) {
21
+ const errorText = await response.text();
22
+ return {
23
+ content: [
24
+ {
25
+ type: "text",
26
+ text: `Error executing query: ${response.status} ${response.statusText}\n${errorText}`,
27
+ },
28
+ ],
29
+ isError: true,
30
+ };
31
+ }
32
+ const result = await response.text();
33
+ return {
34
+ content: [{ type: "text", text: result }],
35
+ };
36
+ });
37
+ }
38
+ //# sourceMappingURL=execute-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute-query.js","sourceRoot":"","sources":["../../src/tools/execute-query.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAiB,EACjB,MAAsB;IAEtB,MAAM,CAAC,IAAI,CACT,eAAe,EACf,iGAAiG,EACjG;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;KACvD,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAClB,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,OAAO,aAAa,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;QAEtE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE;aACxC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,0BAA0B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE;qBACvF;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrC,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACnD,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Get Resource Tool
3
+ * Fetches the full datafile content of a resource
4
+ */
5
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import type { ResolvedConfig } from "../config.js";
7
+ /**
8
+ * Register the get_resource tool
9
+ */
10
+ export declare function registerGetResourceTool(server: McpServer, config: ResolvedConfig): void;
11
+ //# sourceMappingURL=get-resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-resource.d.ts","sourceRoot":"","sources":["../../src/tools/get-resource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAwBnD;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,cAAc,GACrB,IAAI,CAmDN"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Get Resource Tool
3
+ * Fetches the full datafile content of a resource
4
+ */
5
+ import { z } from "zod";
6
+ import { resolveEnvironmentConfig } from "../config.js";
7
+ /**
8
+ * Build the API URL for fetching a resource's datafile content
9
+ */
10
+ function buildResourceUrl(baseUrl, type, name) {
11
+ const encodedName = encodeURIComponent(name);
12
+ switch (type) {
13
+ case "datasource":
14
+ return `${baseUrl}/v0/datasources/${encodedName}.datasource`;
15
+ case "pipe":
16
+ return `${baseUrl}/v1/pipes/${encodedName}.pipe`;
17
+ case "connection":
18
+ return `${baseUrl}/v0/connectors/${encodedName}.connection`;
19
+ }
20
+ }
21
+ /**
22
+ * Register the get_resource tool
23
+ */
24
+ export function registerGetResourceTool(server, config) {
25
+ server.tool("get_resource", "Get the full datafile content of a resource. Use list_resources first to find resource names.", {
26
+ name: z.string().describe("The name of the resource to fetch"),
27
+ type: z
28
+ .enum(["datasource", "pipe", "connection"])
29
+ .describe("The type of resource: 'datasource', 'pipe', or 'connection'"),
30
+ environment: z
31
+ .string()
32
+ .optional()
33
+ .describe("Environment to query: 'cloud' (default), 'local', or a branch name"),
34
+ }, async ({ name, type, environment }) => {
35
+ // Resolve the effective config based on environment
36
+ const effectiveConfig = await resolveEnvironmentConfig(config, environment);
37
+ const url = buildResourceUrl(effectiveConfig.baseUrl, type, name);
38
+ const response = await fetch(url, {
39
+ method: "GET",
40
+ headers: {
41
+ Authorization: `Bearer ${effectiveConfig.token}`,
42
+ },
43
+ });
44
+ if (!response.ok) {
45
+ const errorText = await response.text();
46
+ return {
47
+ content: [
48
+ {
49
+ type: "text",
50
+ text: `Error fetching ${type} '${name}': ${response.status} ${response.statusText}\n${errorText}`,
51
+ },
52
+ ],
53
+ isError: true,
54
+ };
55
+ }
56
+ const content = await response.text();
57
+ return {
58
+ content: [
59
+ {
60
+ type: "text",
61
+ text: content,
62
+ },
63
+ ],
64
+ };
65
+ });
66
+ }
67
+ //# sourceMappingURL=get-resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-resource.js","sourceRoot":"","sources":["../../src/tools/get-resource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAIxD;;GAEG;AACH,SAAS,gBAAgB,CACvB,OAAe,EACf,IAAkB,EAClB,IAAY;IAEZ,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC7C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,YAAY;YACf,OAAO,GAAG,OAAO,mBAAmB,WAAW,aAAa,CAAC;QAC/D,KAAK,MAAM;YACT,OAAO,GAAG,OAAO,aAAa,WAAW,OAAO,CAAC;QACnD,KAAK,YAAY;YACf,OAAO,GAAG,OAAO,kBAAkB,WAAW,aAAa,CAAC;IAChE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAiB,EACjB,MAAsB;IAEtB,MAAM,CAAC,IAAI,CACT,cAAc,EACd,+FAA+F,EAC/F;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QAC9D,IAAI,EAAE,CAAC;aACJ,IAAI,CAAC,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;aAC1C,QAAQ,CAAC,6DAA6D,CAAC;QAC1E,WAAW,EAAE,CAAC;aACX,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,oEAAoE,CAAC;KAClF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE;QACpC,oDAAoD;QACpD,MAAM,eAAe,GAAG,MAAM,wBAAwB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAE5E,MAAM,GAAG,GAAG,gBAAgB,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAElE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,eAAe,CAAC,KAAK,EAAE;aACjD;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,kBAAkB,IAAI,KAAK,IAAI,MAAM,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE;qBAClG;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtC,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,OAAO;iBACd;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * List Branches Tool
3
+ * Lists all branches (environments) in the workspace
4
+ */
5
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import type { ResolvedConfig } from "../config.js";
7
+ /**
8
+ * Register the list_branches tool
9
+ */
10
+ export declare function registerListBranchesTool(server: McpServer, config: ResolvedConfig): void;
11
+ //# sourceMappingURL=list-branches.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-branches.d.ts","sourceRoot":"","sources":["../../src/tools/list-branches.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAYnD;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,cAAc,GACrB,IAAI,CAyCN"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * List Branches Tool
3
+ * Lists all branches (environments) in the workspace
4
+ */
5
+ /**
6
+ * Register the list_branches tool
7
+ */
8
+ export function registerListBranchesTool(server, config) {
9
+ server.tool("list_branches", "List all branches (environments) in the Tinybird workspace. Use branch names with the 'environment' parameter in other tools.", {}, async () => {
10
+ const url = new URL("/v1/environments", config.baseUrl);
11
+ const response = await fetch(url.toString(), {
12
+ method: "GET",
13
+ headers: {
14
+ Authorization: `Bearer ${config.token}`,
15
+ },
16
+ });
17
+ if (!response.ok) {
18
+ const errorText = await response.text();
19
+ return {
20
+ content: [
21
+ {
22
+ type: "text",
23
+ text: `Error listing branches: ${response.status} ${response.statusText}\n${errorText}`,
24
+ },
25
+ ],
26
+ isError: true,
27
+ };
28
+ }
29
+ const data = (await response.json());
30
+ const branches = data.environments ?? [];
31
+ return {
32
+ content: [
33
+ {
34
+ type: "text",
35
+ text: JSON.stringify(branches, null, 2),
36
+ },
37
+ ],
38
+ };
39
+ });
40
+ }
41
+ //# sourceMappingURL=list-branches.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-branches.js","sourceRoot":"","sources":["../../src/tools/list-branches.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAiB,EACjB,MAAsB;IAEtB,MAAM,CAAC,IAAI,CACT,eAAe,EACf,+HAA+H,EAC/H,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAExD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;YAC3C,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE;aACxC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,2BAA2B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE;qBACxF;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAqB,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;QAEzC,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;iBACxC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * List Kafka Topics Tool
3
+ * Lists available topics from a Kafka connection
4
+ */
5
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import type { ResolvedConfig } from "../config.js";
7
+ /**
8
+ * Register the list_kafka_topics tool
9
+ */
10
+ export declare function registerListKafkaTopicsTool(server: McpServer, config: ResolvedConfig): void;
11
+ //# sourceMappingURL=list-kafka-topics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-kafka-topics.d.ts","sourceRoot":"","sources":["../../src/tools/list-kafka-topics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAMnD;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,cAAc,GACrB,IAAI,CA4CN"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * List Kafka Topics Tool
3
+ * Lists available topics from a Kafka connection
4
+ */
5
+ import { z } from "zod";
6
+ /**
7
+ * Register the list_kafka_topics tool
8
+ */
9
+ export function registerListKafkaTopicsTool(server, config) {
10
+ server.tool("list_kafka_topics", "List available topics from a Kafka connection. Use list_connections first to get the connection ID.", {
11
+ connection_id: z
12
+ .string()
13
+ .describe("The ID of the Kafka connection (get this from list_connections)"),
14
+ }, async ({ connection_id }) => {
15
+ const url = `${config.baseUrl}/v0/connectors/${connection_id}/preview?preview_activity=false`;
16
+ const response = await fetch(url, {
17
+ method: "GET",
18
+ headers: {
19
+ Authorization: `Bearer ${config.token}`,
20
+ },
21
+ });
22
+ if (!response.ok) {
23
+ const errorText = await response.text();
24
+ return {
25
+ content: [
26
+ {
27
+ type: "text",
28
+ text: `Error listing Kafka topics: ${response.status} ${response.statusText}\n${errorText}`,
29
+ },
30
+ ],
31
+ isError: true,
32
+ };
33
+ }
34
+ const data = (await response.json());
35
+ const topics = data.preview.map((x) => x.topic);
36
+ return {
37
+ content: [
38
+ {
39
+ type: "text",
40
+ text: JSON.stringify({ topics }, null, 2),
41
+ },
42
+ ],
43
+ };
44
+ });
45
+ }
46
+ //# sourceMappingURL=list-kafka-topics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-kafka-topics.js","sourceRoot":"","sources":["../../src/tools/list-kafka-topics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB;;GAEG;AACH,MAAM,UAAU,2BAA2B,CACzC,MAAiB,EACjB,MAAsB;IAEtB,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,qGAAqG,EACrG;QACE,aAAa,EAAE,CAAC;aACb,MAAM,EAAE;aACR,QAAQ,CAAC,iEAAiE,CAAC;KAC/E,EACD,KAAK,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE;QAC1B,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,OAAO,kBAAkB,aAAa,iCAAiC,CAAC;QAC9F,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE;aACxC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,+BAA+B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE;qBAC5F;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAwB,CAAC;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAEhD,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBAC1C;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * List Resources Tool
3
+ * Lists all resources (datasources, pipes, connections) in the workspace
4
+ */
5
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import type { ResolvedConfig } from "../config.js";
7
+ /**
8
+ * Register the list_resources tool
9
+ */
10
+ export declare function registerListResourcesTool(server: McpServer, config: ResolvedConfig): void;
11
+ //# sourceMappingURL=list-resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-resources.d.ts","sourceRoot":"","sources":["../../src/tools/list-resources.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAuCnD;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,cAAc,GACrB,IAAI,CAqGN"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * List Resources Tool
3
+ * Lists all resources (datasources, pipes, connections) in the workspace
4
+ */
5
+ import { z } from "zod";
6
+ import { resolveEnvironmentConfig } from "../config.js";
7
+ /**
8
+ * Register the list_resources tool
9
+ */
10
+ export function registerListResourcesTool(server, config) {
11
+ server.tool("list_resources", "List all resources in the workspace. Returns resource id, name, description, and type. Filter by type: 'datasource', 'pipe', or 'connection'. Use get_resource to fetch full datafile content.", {
12
+ type: z
13
+ .enum(["datasource", "pipe", "connection"])
14
+ .optional()
15
+ .describe("Filter by resource type: 'datasource', 'pipe', or 'connection'"),
16
+ environment: z
17
+ .string()
18
+ .optional()
19
+ .describe("Environment to query: 'cloud' (default), 'local', or a branch name"),
20
+ }, async ({ type, environment }) => {
21
+ // Resolve the effective config based on environment
22
+ const effectiveConfig = await resolveEnvironmentConfig(config, environment);
23
+ const resources = [];
24
+ const types = type
25
+ ? [type]
26
+ : ["datasource", "pipe", "connection"];
27
+ // Fetch datasources
28
+ if (types.includes("datasource")) {
29
+ const url = `${effectiveConfig.baseUrl}/v0/datasources`;
30
+ const response = await fetch(url, {
31
+ method: "GET",
32
+ headers: {
33
+ Authorization: `Bearer ${effectiveConfig.token}`,
34
+ },
35
+ });
36
+ if (response.ok) {
37
+ const data = (await response.json());
38
+ for (const ds of data.datasources) {
39
+ resources.push({
40
+ id: ds.id,
41
+ name: ds.name,
42
+ type: "datasource",
43
+ description: ds.description,
44
+ });
45
+ }
46
+ }
47
+ }
48
+ // Fetch pipes
49
+ if (types.includes("pipe")) {
50
+ const url = `${effectiveConfig.baseUrl}/v0/pipes`;
51
+ const response = await fetch(url, {
52
+ method: "GET",
53
+ headers: {
54
+ Authorization: `Bearer ${effectiveConfig.token}`,
55
+ },
56
+ });
57
+ if (response.ok) {
58
+ const data = (await response.json());
59
+ for (const pipe of data.pipes) {
60
+ resources.push({
61
+ id: pipe.id,
62
+ name: pipe.name,
63
+ type: "pipe",
64
+ description: pipe.description,
65
+ });
66
+ }
67
+ }
68
+ }
69
+ // Fetch connections
70
+ if (types.includes("connection")) {
71
+ const url = `${effectiveConfig.baseUrl}/v0/connectors`;
72
+ const response = await fetch(url, {
73
+ method: "GET",
74
+ headers: {
75
+ Authorization: `Bearer ${effectiveConfig.token}`,
76
+ },
77
+ });
78
+ if (response.ok) {
79
+ const data = (await response.json());
80
+ for (const conn of data.connectors) {
81
+ resources.push({
82
+ id: conn.id,
83
+ name: conn.name,
84
+ type: "connection",
85
+ });
86
+ }
87
+ }
88
+ }
89
+ return {
90
+ content: [
91
+ {
92
+ type: "text",
93
+ text: JSON.stringify(resources, null, 2),
94
+ },
95
+ ],
96
+ };
97
+ });
98
+ }
99
+ //# sourceMappingURL=list-resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-resources.js","sourceRoot":"","sources":["../../src/tools/list-resources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Preview Kafka Topic Tool
3
+ * Preview data from a Kafka topic
4
+ */
5
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import type { ResolvedConfig } from "../config.js";
7
+ /**
8
+ * Register the preview_kafka_topic tool
9
+ */
10
+ export declare function registerPreviewKafkaTopicTool(server: McpServer, config: ResolvedConfig): void;
11
+ //# sourceMappingURL=preview-kafka-topic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-kafka-topic.d.ts","sourceRoot":"","sources":["../../src/tools/preview-kafka-topic.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAUnD;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,cAAc,GACrB,IAAI,CAuGN"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Preview Kafka Topic Tool
3
+ * Preview data from a Kafka topic
4
+ */
5
+ import { z } from "zod";
6
+ /**
7
+ * Register the preview_kafka_topic tool
8
+ */
9
+ export function registerPreviewKafkaTopicTool(server, config) {
10
+ server.tool("preview_kafka_topic", "Preview data from a Kafka topic. Shows sample messages and schema. Use list_kafka_topics first to get available topics.", {
11
+ connection_id: z
12
+ .string()
13
+ .describe("The ID of the Kafka connection (get this from list_connections)"),
14
+ topic: z.string().describe("The Kafka topic name to preview"),
15
+ group_id: z
16
+ .string()
17
+ .optional()
18
+ .describe("Kafka consumer group ID. If not provided, a unique one will be generated based on the topic name."),
19
+ }, async ({ connection_id, topic, group_id }) => {
20
+ const effectiveGroupId = group_id ?? `${topic}_${Date.now()}`;
21
+ // Validate the group ID
22
+ const validateUrl = new URL(`${config.baseUrl}/v0/connectors/${connection_id}/preview`);
23
+ validateUrl.searchParams.set("log", "previewGroup");
24
+ validateUrl.searchParams.set("kafka_group_id", effectiveGroupId);
25
+ validateUrl.searchParams.set("kafka_topic", topic);
26
+ validateUrl.searchParams.set("preview_group", "true");
27
+ const validateResponse = await fetch(validateUrl.toString(), {
28
+ method: "GET",
29
+ headers: {
30
+ Authorization: `Bearer ${config.token}`,
31
+ },
32
+ });
33
+ if (!validateResponse.ok) {
34
+ const errorText = await validateResponse.text();
35
+ return {
36
+ content: [
37
+ {
38
+ type: "text",
39
+ text: `Error validating Kafka group ID: ${validateResponse.status} ${validateResponse.statusText}\n${errorText}`,
40
+ },
41
+ ],
42
+ isError: true,
43
+ };
44
+ }
45
+ // Preview the topic
46
+ const previewUrl = new URL(`${config.baseUrl}/v0/connectors/${connection_id}/preview`);
47
+ previewUrl.searchParams.set("max_records", "12");
48
+ previewUrl.searchParams.set("preview_activity", "true");
49
+ previewUrl.searchParams.set("preview_earliest_timestamp", "true");
50
+ previewUrl.searchParams.set("kafka_topic", topic);
51
+ previewUrl.searchParams.set("kafka_group_id", effectiveGroupId);
52
+ previewUrl.searchParams.set("log", "previewTopic");
53
+ const previewResponse = await fetch(previewUrl.toString(), {
54
+ method: "GET",
55
+ headers: {
56
+ Authorization: `Bearer ${config.token}`,
57
+ },
58
+ });
59
+ if (!previewResponse.ok) {
60
+ const errorText = await previewResponse.text();
61
+ return {
62
+ content: [
63
+ {
64
+ type: "text",
65
+ text: `Error previewing Kafka topic: ${previewResponse.status} ${previewResponse.statusText}\n${errorText}`,
66
+ },
67
+ ],
68
+ isError: true,
69
+ };
70
+ }
71
+ const data = (await previewResponse.json());
72
+ const preview = data.preview ?? {};
73
+ const messages = preview.data ?? [];
74
+ const schema = preview.meta ?? [];
75
+ const result = {
76
+ topic,
77
+ group_id: effectiveGroupId,
78
+ earliest_timestamp: data.earliestTimestamp,
79
+ schema: schema.map((col) => ({ name: col.name, type: col.type })),
80
+ message_count: messages.length,
81
+ messages,
82
+ };
83
+ return {
84
+ content: [
85
+ {
86
+ type: "text",
87
+ text: JSON.stringify(result, null, 2),
88
+ },
89
+ ],
90
+ };
91
+ });
92
+ }
93
+ //# sourceMappingURL=preview-kafka-topic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-kafka-topic.js","sourceRoot":"","sources":["../../src/tools/preview-kafka-topic.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@tinybirdco/devtools-mcp",
3
+ "version": "0.0.1",
4
+ "description": "Tinybird DevTools MCP Server",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "bin": {
8
+ "tinybird-devtools-mcp": "./dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "keywords": [
14
+ "tinybird",
15
+ "mcp",
16
+ "devtools",
17
+ "model-context-protocol"
18
+ ],
19
+ "author": "Tinybird",
20
+ "license": "MIT",
21
+ "dependencies": {
22
+ "@modelcontextprotocol/sdk": "^1.12.2",
23
+ "dotenv": "^16.0.0",
24
+ "zod": "^3.25.0"
25
+ },
26
+ "devDependencies": {
27
+ "@types/node": "^20.0.0",
28
+ "typescript": "^5.3.0"
29
+ },
30
+ "engines": {
31
+ "node": ">=20.0.0"
32
+ },
33
+ "scripts": {
34
+ "build": "tsc",
35
+ "dev": "tsc --watch",
36
+ "typecheck": "tsc --noEmit"
37
+ }
38
+ }