@bland-ai/cli 0.1.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 (126) hide show
  1. package/dist/commands/agent.d.ts +3 -0
  2. package/dist/commands/agent.d.ts.map +1 -0
  3. package/dist/commands/agent.js +143 -0
  4. package/dist/commands/agent.js.map +1 -0
  5. package/dist/commands/alarm.d.ts +3 -0
  6. package/dist/commands/alarm.d.ts.map +1 -0
  7. package/dist/commands/alarm.js +92 -0
  8. package/dist/commands/alarm.js.map +1 -0
  9. package/dist/commands/audio.d.ts +3 -0
  10. package/dist/commands/audio.d.ts.map +1 -0
  11. package/dist/commands/audio.js +77 -0
  12. package/dist/commands/audio.js.map +1 -0
  13. package/dist/commands/auth.d.ts +3 -0
  14. package/dist/commands/auth.d.ts.map +1 -0
  15. package/dist/commands/auth.js +199 -0
  16. package/dist/commands/auth.js.map +1 -0
  17. package/dist/commands/batch.d.ts +3 -0
  18. package/dist/commands/batch.d.ts.map +1 -0
  19. package/dist/commands/batch.js +108 -0
  20. package/dist/commands/batch.js.map +1 -0
  21. package/dist/commands/call.d.ts +3 -0
  22. package/dist/commands/call.d.ts.map +1 -0
  23. package/dist/commands/call.js +348 -0
  24. package/dist/commands/call.js.map +1 -0
  25. package/dist/commands/eval.d.ts +3 -0
  26. package/dist/commands/eval.d.ts.map +1 -0
  27. package/dist/commands/eval.js +66 -0
  28. package/dist/commands/eval.js.map +1 -0
  29. package/dist/commands/guard.d.ts +3 -0
  30. package/dist/commands/guard.d.ts.map +1 -0
  31. package/dist/commands/guard.js +100 -0
  32. package/dist/commands/guard.js.map +1 -0
  33. package/dist/commands/knowledge.d.ts +3 -0
  34. package/dist/commands/knowledge.d.ts.map +1 -0
  35. package/dist/commands/knowledge.js +136 -0
  36. package/dist/commands/knowledge.js.map +1 -0
  37. package/dist/commands/listen.d.ts +3 -0
  38. package/dist/commands/listen.d.ts.map +1 -0
  39. package/dist/commands/listen.js +98 -0
  40. package/dist/commands/listen.js.map +1 -0
  41. package/dist/commands/mcp.d.ts +3 -0
  42. package/dist/commands/mcp.d.ts.map +1 -0
  43. package/dist/commands/mcp.js +22 -0
  44. package/dist/commands/mcp.js.map +1 -0
  45. package/dist/commands/number.d.ts +3 -0
  46. package/dist/commands/number.d.ts.map +1 -0
  47. package/dist/commands/number.js +225 -0
  48. package/dist/commands/number.js.map +1 -0
  49. package/dist/commands/pathway.d.ts +3 -0
  50. package/dist/commands/pathway.d.ts.map +1 -0
  51. package/dist/commands/pathway.js +977 -0
  52. package/dist/commands/pathway.js.map +1 -0
  53. package/dist/commands/persona.d.ts +3 -0
  54. package/dist/commands/persona.d.ts.map +1 -0
  55. package/dist/commands/persona.js +234 -0
  56. package/dist/commands/persona.js.map +1 -0
  57. package/dist/commands/release.d.ts +3 -0
  58. package/dist/commands/release.d.ts.map +1 -0
  59. package/dist/commands/release.js +67 -0
  60. package/dist/commands/release.js.map +1 -0
  61. package/dist/commands/secret.d.ts +3 -0
  62. package/dist/commands/secret.d.ts.map +1 -0
  63. package/dist/commands/secret.js +57 -0
  64. package/dist/commands/secret.js.map +1 -0
  65. package/dist/commands/sip.d.ts +3 -0
  66. package/dist/commands/sip.d.ts.map +1 -0
  67. package/dist/commands/sip.js +45 -0
  68. package/dist/commands/sip.js.map +1 -0
  69. package/dist/commands/sms.d.ts +3 -0
  70. package/dist/commands/sms.d.ts.map +1 -0
  71. package/dist/commands/sms.js +83 -0
  72. package/dist/commands/sms.js.map +1 -0
  73. package/dist/commands/tool.d.ts +3 -0
  74. package/dist/commands/tool.d.ts.map +1 -0
  75. package/dist/commands/tool.js +200 -0
  76. package/dist/commands/tool.js.map +1 -0
  77. package/dist/commands/voice.d.ts +3 -0
  78. package/dist/commands/voice.d.ts.map +1 -0
  79. package/dist/commands/voice.js +95 -0
  80. package/dist/commands/voice.js.map +1 -0
  81. package/dist/commands/widget.d.ts +3 -0
  82. package/dist/commands/widget.d.ts.map +1 -0
  83. package/dist/commands/widget.js +77 -0
  84. package/dist/commands/widget.js.map +1 -0
  85. package/dist/index.d.ts +3 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +52 -0
  88. package/dist/index.js.map +1 -0
  89. package/dist/lib/api.d.ts +17 -0
  90. package/dist/lib/api.d.ts.map +1 -0
  91. package/dist/lib/api.js +89 -0
  92. package/dist/lib/api.js.map +1 -0
  93. package/dist/lib/config.d.ts +16 -0
  94. package/dist/lib/config.d.ts.map +1 -0
  95. package/dist/lib/config.js +117 -0
  96. package/dist/lib/config.js.map +1 -0
  97. package/dist/lib/errors.d.ts +15 -0
  98. package/dist/lib/errors.d.ts.map +1 -0
  99. package/dist/lib/errors.js +43 -0
  100. package/dist/lib/errors.js.map +1 -0
  101. package/dist/lib/output.d.ts +30 -0
  102. package/dist/lib/output.d.ts.map +1 -0
  103. package/dist/lib/output.js +131 -0
  104. package/dist/lib/output.js.map +1 -0
  105. package/dist/lib/pathway-file.d.ts +31 -0
  106. package/dist/lib/pathway-file.d.ts.map +1 -0
  107. package/dist/lib/pathway-file.js +236 -0
  108. package/dist/lib/pathway-file.js.map +1 -0
  109. package/dist/mcp/server.d.ts +2 -0
  110. package/dist/mcp/server.d.ts.map +1 -0
  111. package/dist/mcp/server.js +375 -0
  112. package/dist/mcp/server.js.map +1 -0
  113. package/dist/types/api.d.ts +302 -0
  114. package/dist/types/api.d.ts.map +1 -0
  115. package/dist/types/api.js +2 -0
  116. package/dist/types/api.js.map +1 -0
  117. package/dist/types/config.d.ts +14 -0
  118. package/dist/types/config.d.ts.map +1 -0
  119. package/dist/types/config.js +2 -0
  120. package/dist/types/config.js.map +1 -0
  121. package/dist/types/pathway.d.ts +55 -0
  122. package/dist/types/pathway.d.ts.map +1 -0
  123. package/dist/types/pathway.js +2 -0
  124. package/dist/types/pathway.js.map +1 -0
  125. package/package.json +51 -0
  126. package/templates/pathway.yaml +30 -0
@@ -0,0 +1,236 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import * as yaml from "yaml";
4
+ import { BlandError } from "./errors.js";
5
+ const PATHWAY_FILE_NAMES = [
6
+ "bland-pathway.yaml",
7
+ "bland-pathway.yml",
8
+ "bland-pathway.json",
9
+ "pathway.yaml",
10
+ "pathway.yml",
11
+ ];
12
+ /** Find pathway file in a directory */
13
+ export function findPathwayFile(dir) {
14
+ for (const name of PATHWAY_FILE_NAMES) {
15
+ const filePath = path.join(dir, name);
16
+ if (fs.existsSync(filePath)) {
17
+ return filePath;
18
+ }
19
+ }
20
+ return null;
21
+ }
22
+ /** Read and parse a local pathway file */
23
+ export function readPathwayFile(filePath) {
24
+ if (!fs.existsSync(filePath)) {
25
+ throw new BlandError(`File not found: ${filePath}`);
26
+ }
27
+ const content = fs.readFileSync(filePath, "utf-8");
28
+ const ext = path.extname(filePath).toLowerCase();
29
+ let parsed;
30
+ if (ext === ".json") {
31
+ parsed = JSON.parse(content);
32
+ }
33
+ else {
34
+ parsed = yaml.parse(content);
35
+ }
36
+ validatePathwayFile(parsed);
37
+ return parsed;
38
+ }
39
+ /** Write a pathway file to disk */
40
+ export function writePathwayFile(filePath, pathway) {
41
+ const ext = path.extname(filePath).toLowerCase();
42
+ let content;
43
+ if (ext === ".json") {
44
+ content = JSON.stringify(pathway, null, 2);
45
+ }
46
+ else {
47
+ content = yaml.stringify(pathway, {
48
+ lineWidth: 120,
49
+ defaultKeyType: "PLAIN",
50
+ defaultStringType: "PLAIN",
51
+ });
52
+ }
53
+ const dir = path.dirname(filePath);
54
+ if (!fs.existsSync(dir)) {
55
+ fs.mkdirSync(dir, { recursive: true });
56
+ }
57
+ fs.writeFileSync(filePath, content, "utf-8");
58
+ }
59
+ /** Validate pathway file structure */
60
+ function validatePathwayFile(file) {
61
+ if (!file.name) {
62
+ throw new BlandError("Pathway file must have a 'name' field.");
63
+ }
64
+ if (!file.nodes || Object.keys(file.nodes).length === 0) {
65
+ throw new BlandError("Pathway file must have at least one node.");
66
+ }
67
+ // Validate edges reference existing nodes
68
+ const nodeNames = new Set(Object.keys(file.nodes));
69
+ for (const [nodeName, node] of Object.entries(file.nodes)) {
70
+ if (node.edges) {
71
+ for (const edge of node.edges) {
72
+ if (!nodeNames.has(edge.target)) {
73
+ throw new BlandError(`Node "${nodeName}" has an edge targeting unknown node "${edge.target}".`);
74
+ }
75
+ }
76
+ }
77
+ }
78
+ }
79
+ /** Convert API pathway response to local file format */
80
+ export function apiToFile(pathway) {
81
+ const file = {
82
+ name: pathway.name,
83
+ description: pathway.description,
84
+ nodes: {},
85
+ };
86
+ // Build edge map (source -> edges[])
87
+ const edgeMap = new Map();
88
+ for (const edge of pathway.edges || []) {
89
+ const existing = edgeMap.get(edge.source) || [];
90
+ existing.push(edge);
91
+ edgeMap.set(edge.source, existing);
92
+ }
93
+ // Convert nodes
94
+ for (const apiNode of pathway.nodes || []) {
95
+ // Skip nodes with no data (metadata/placeholder nodes)
96
+ if (!apiNode.data || (!apiNode.data.name && !apiNode.id))
97
+ continue;
98
+ const nodeId = apiNode.data.name || apiNode.id;
99
+ const fileNode = {};
100
+ if (apiNode.data.type)
101
+ fileNode.type = apiNode.data.type;
102
+ if (apiNode.data.prompt)
103
+ fileNode.prompt = apiNode.data.prompt;
104
+ if (apiNode.data.isGlobal)
105
+ fileNode.is_global = true;
106
+ if (apiNode.data.globalLabel)
107
+ fileNode.global_label = apiNode.data.globalLabel;
108
+ // Extract variables
109
+ if (apiNode.data.extractVars && apiNode.data.extractVars.length > 0) {
110
+ fileNode.extract_variables = apiNode.data.extractVars.map((v) => ({
111
+ name: v.name,
112
+ type: v.type,
113
+ description: v.description,
114
+ }));
115
+ }
116
+ // Add edges inline with node
117
+ const nodeEdges = edgeMap.get(apiNode.id);
118
+ if (nodeEdges && nodeEdges.length > 0) {
119
+ // Need to resolve target IDs to node names
120
+ const idToName = new Map();
121
+ for (const n of pathway.nodes) {
122
+ if (!n.data || !n.id)
123
+ continue;
124
+ idToName.set(n.id, n.data.name || n.id);
125
+ }
126
+ fileNode.edges = nodeEdges.map((e) => ({
127
+ target: idToName.get(e.target) || e.target,
128
+ ...(e.data?.condition ? { condition: e.data.condition } : {}),
129
+ }));
130
+ }
131
+ file.nodes[nodeId] = fileNode;
132
+ }
133
+ return file;
134
+ }
135
+ /** Convert local file format to API request body */
136
+ export function fileToApi(file) {
137
+ const nodes = [];
138
+ const edges = [];
139
+ const nameToId = new Map();
140
+ // First pass: create node IDs
141
+ let nodeIndex = 0;
142
+ for (const nodeName of Object.keys(file.nodes)) {
143
+ const id = `node_${nodeIndex++}`;
144
+ nameToId.set(nodeName, id);
145
+ }
146
+ // Second pass: build nodes and edges
147
+ nodeIndex = 0;
148
+ for (const [nodeName, fileNode] of Object.entries(file.nodes)) {
149
+ const id = nameToId.get(nodeName);
150
+ const node = {
151
+ id,
152
+ type: "custom",
153
+ position: { x: nodeIndex * 300, y: 0 },
154
+ data: {
155
+ name: nodeName,
156
+ prompt: fileNode.prompt,
157
+ type: fileNode.type || "default",
158
+ isGlobal: fileNode.is_global,
159
+ globalLabel: fileNode.global_label,
160
+ extractVars: fileNode.extract_variables,
161
+ tools: fileNode.tools,
162
+ },
163
+ };
164
+ nodes.push(node);
165
+ // Build edges from this node
166
+ if (fileNode.edges) {
167
+ for (const fileEdge of fileNode.edges) {
168
+ const targetId = nameToId.get(fileEdge.target);
169
+ if (!targetId)
170
+ continue;
171
+ edges.push({
172
+ id: `edge_${id}_${targetId}`,
173
+ source: id,
174
+ target: targetId,
175
+ data: fileEdge.condition
176
+ ? { condition: fileEdge.condition }
177
+ : undefined,
178
+ });
179
+ }
180
+ }
181
+ nodeIndex++;
182
+ }
183
+ return { name: file.name, nodes, edges };
184
+ }
185
+ /** Create a starter pathway file */
186
+ export function createStarterPathway(name) {
187
+ return {
188
+ name,
189
+ description: `${name} pathway`,
190
+ version: "draft",
191
+ global: {
192
+ voice: "nat",
193
+ model: "base",
194
+ },
195
+ nodes: {
196
+ greeting: {
197
+ type: "default",
198
+ prompt: "Greet the caller warmly and ask how you can help them today.",
199
+ edges: [
200
+ {
201
+ target: "main",
202
+ condition: "Caller describes what they need",
203
+ },
204
+ ],
205
+ },
206
+ main: {
207
+ type: "default",
208
+ prompt: "Help the caller with their request.",
209
+ edges: [
210
+ {
211
+ target: "goodbye",
212
+ condition: "Caller's request is resolved",
213
+ },
214
+ ],
215
+ },
216
+ goodbye: {
217
+ type: "end_call",
218
+ prompt: "Thank the caller for their time and wish them a great day.",
219
+ },
220
+ },
221
+ };
222
+ }
223
+ /** Create a starter test cases file */
224
+ export function createStarterTestCases(pathwayName) {
225
+ return {
226
+ pathway: pathwayName,
227
+ tests: [
228
+ {
229
+ name: "happy_path",
230
+ scenario: "Caller asks a simple question and gets it resolved quickly.",
231
+ expected_path: ["greeting", "main", "goodbye"],
232
+ },
233
+ ],
234
+ };
235
+ }
236
+ //# sourceMappingURL=pathway-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathway-file.js","sourceRoot":"","sources":["../../src/lib/pathway-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function startMcpServer(_transport: string, _port: number): Promise<void>;
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAkTA,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAwDf"}
@@ -0,0 +1,375 @@
1
+ import { api } from "../lib/api.js";
2
+ import { isAuthenticated } from "../lib/config.js";
3
+ const MCP_TOOLS = [
4
+ {
5
+ name: "bland_call_send",
6
+ description: "Make an outbound phone call via Bland AI",
7
+ inputSchema: {
8
+ type: "object",
9
+ properties: {
10
+ phone_number: { type: "string", description: "Phone number to call" },
11
+ task: { type: "string", description: "Task/prompt for the agent" },
12
+ pathway_id: { type: "string", description: "Pathway ID to use" },
13
+ voice: { type: "string", description: "Voice to use" },
14
+ first_sentence: { type: "string", description: "Opening sentence" },
15
+ model: { type: "string", description: "Model: base or turbo" },
16
+ from: { type: "string", description: "From phone number" },
17
+ },
18
+ required: ["phone_number"],
19
+ },
20
+ },
21
+ {
22
+ name: "bland_call_list",
23
+ description: "List recent calls with optional filters",
24
+ inputSchema: {
25
+ type: "object",
26
+ properties: {
27
+ limit: { type: "string", description: "Max results (default: 20)" },
28
+ start_date: { type: "string", description: "Start date (YYYY-MM-DD)" },
29
+ end_date: { type: "string", description: "End date (YYYY-MM-DD)" },
30
+ },
31
+ },
32
+ },
33
+ {
34
+ name: "bland_call_get",
35
+ description: "Get detailed call info including transcript",
36
+ inputSchema: {
37
+ type: "object",
38
+ properties: {
39
+ call_id: { type: "string", description: "Call ID" },
40
+ },
41
+ required: ["call_id"],
42
+ },
43
+ },
44
+ {
45
+ name: "bland_pathway_list",
46
+ description: "List all conversational pathways",
47
+ inputSchema: { type: "object", properties: {} },
48
+ },
49
+ {
50
+ name: "bland_pathway_get",
51
+ description: "Get pathway details including nodes and edges",
52
+ inputSchema: {
53
+ type: "object",
54
+ properties: {
55
+ pathway_id: { type: "string", description: "Pathway ID" },
56
+ },
57
+ required: ["pathway_id"],
58
+ },
59
+ },
60
+ {
61
+ name: "bland_pathway_create",
62
+ description: "Create a new pathway with nodes and edges",
63
+ inputSchema: {
64
+ type: "object",
65
+ properties: {
66
+ name: { type: "string", description: "Pathway name" },
67
+ nodes: { type: "string", description: "Nodes array as JSON string" },
68
+ edges: { type: "string", description: "Edges array as JSON string" },
69
+ },
70
+ required: ["name"],
71
+ },
72
+ },
73
+ {
74
+ name: "bland_pathway_chat",
75
+ description: "Chat with a pathway to test it interactively. First call creates a session, subsequent calls send messages.",
76
+ inputSchema: {
77
+ type: "object",
78
+ properties: {
79
+ pathway_id: { type: "string", description: "Pathway ID (required for first message)" },
80
+ chat_id: { type: "string", description: "Chat session ID (from first response)" },
81
+ message: { type: "string", description: "Message to send" },
82
+ },
83
+ required: ["message"],
84
+ },
85
+ },
86
+ {
87
+ name: "bland_pathway_node_test",
88
+ description: "Test an individual pathway node with permutations",
89
+ inputSchema: {
90
+ type: "object",
91
+ properties: {
92
+ pathway_id: { type: "string", description: "Pathway ID" },
93
+ node_id: { type: "string", description: "Node ID to test" },
94
+ prompt: { type: "string", description: "Override node prompt" },
95
+ permutations: { type: "string", description: "Number of variations (default: 5)" },
96
+ },
97
+ required: ["pathway_id", "node_id"],
98
+ },
99
+ },
100
+ {
101
+ name: "bland_persona_list",
102
+ description: "List all personas",
103
+ inputSchema: { type: "object", properties: {} },
104
+ },
105
+ {
106
+ name: "bland_persona_get",
107
+ description: "Get persona details",
108
+ inputSchema: {
109
+ type: "object",
110
+ properties: {
111
+ persona_id: { type: "string", description: "Persona ID" },
112
+ },
113
+ required: ["persona_id"],
114
+ },
115
+ },
116
+ {
117
+ name: "bland_number_list",
118
+ description: "List owned phone numbers",
119
+ inputSchema: { type: "object", properties: {} },
120
+ },
121
+ {
122
+ name: "bland_number_buy",
123
+ description: "Purchase a phone number",
124
+ inputSchema: {
125
+ type: "object",
126
+ properties: {
127
+ area_code: { type: "string", description: "Preferred area code" },
128
+ country_code: { type: "string", description: "Country code (default: US)" },
129
+ },
130
+ },
131
+ },
132
+ {
133
+ name: "bland_voice_list",
134
+ description: "List available voices",
135
+ inputSchema: { type: "object", properties: {} },
136
+ },
137
+ {
138
+ name: "bland_tool_test",
139
+ description: "Test a custom tool with sample input",
140
+ inputSchema: {
141
+ type: "object",
142
+ properties: {
143
+ tool_id: { type: "string", description: "Tool ID" },
144
+ input: { type: "string", description: "Test input as JSON string" },
145
+ },
146
+ required: ["tool_id"],
147
+ },
148
+ },
149
+ {
150
+ name: "bland_knowledge_list",
151
+ description: "List knowledge bases",
152
+ inputSchema: { type: "object", properties: {} },
153
+ },
154
+ {
155
+ name: "bland_audio_generate",
156
+ description: "Generate TTS audio from text",
157
+ inputSchema: {
158
+ type: "object",
159
+ properties: {
160
+ text: { type: "string", description: "Text to speak" },
161
+ voice: { type: "string", description: "Voice to use (default: nat)" },
162
+ },
163
+ required: ["text"],
164
+ },
165
+ },
166
+ ];
167
+ async function handleToolCall(name, args) {
168
+ switch (name) {
169
+ case "bland_call_send":
170
+ return api.post("/v1/calls", args);
171
+ case "bland_call_list":
172
+ return api.get("/v1/calls", {
173
+ limit: args.limit,
174
+ start_date: args.start_date,
175
+ end_date: args.end_date,
176
+ });
177
+ case "bland_call_get":
178
+ return api.get(`/v1/calls/${args.call_id}`);
179
+ case "bland_pathway_list":
180
+ return api.get("/v1/convo_pathway");
181
+ case "bland_pathway_get":
182
+ return api.get(`/v1/convo_pathway/${args.pathway_id}`);
183
+ case "bland_pathway_create": {
184
+ const body = { name: args.name };
185
+ if (args.nodes)
186
+ body.nodes = JSON.parse(args.nodes);
187
+ if (args.edges)
188
+ body.edges = JSON.parse(args.edges);
189
+ return api.post("/v1/convo_pathway", body);
190
+ }
191
+ case "bland_pathway_chat": {
192
+ if (args.chat_id) {
193
+ return api.post(`/v1/pathway/chat/${args.chat_id}`, {
194
+ message: args.message,
195
+ });
196
+ }
197
+ // Create new session
198
+ const session = await api.post("/v1/pathway/chat", { pathway_id: args.pathway_id });
199
+ // Send first message
200
+ const response = await api.post(`/v1/pathway/chat/${session.chat_id}`, { message: args.message });
201
+ return { chat_id: session.chat_id, ...response };
202
+ }
203
+ case "bland_pathway_node_test":
204
+ return api.post("/v1/node_tests/run", {
205
+ pathway_id: args.pathway_id,
206
+ node_id: args.node_id,
207
+ new_prompt: args.prompt,
208
+ n_permutations: args.permutations
209
+ ? parseInt(args.permutations, 10)
210
+ : 5,
211
+ });
212
+ case "bland_persona_list":
213
+ return api.get("/v1/personas");
214
+ case "bland_persona_get":
215
+ return api.get(`/v1/personas/${args.persona_id}`);
216
+ case "bland_number_list":
217
+ return api.get("/v1/inbound");
218
+ case "bland_number_buy":
219
+ return api.post("/v1/inbound/purchase", {
220
+ area_code: args.area_code,
221
+ country_code: args.country_code || "US",
222
+ });
223
+ case "bland_voice_list":
224
+ return api.get("/v1/voices");
225
+ case "bland_tool_test": {
226
+ const testInput = args.input
227
+ ? JSON.parse(args.input)
228
+ : {};
229
+ return api.post(`/v1/tools/${args.tool_id}/test`, {
230
+ input: testInput,
231
+ });
232
+ }
233
+ case "bland_knowledge_list":
234
+ return api.get("/v1/knowledge");
235
+ case "bland_audio_generate":
236
+ return api.post("/v1/speak", {
237
+ text: args.text,
238
+ voice: args.voice || "nat",
239
+ });
240
+ default:
241
+ throw new Error(`Unknown tool: ${name}`);
242
+ }
243
+ }
244
+ export async function startMcpServer(_transport, _port) {
245
+ if (!isAuthenticated()) {
246
+ process.stderr.write("Error: Not authenticated. Run `bland auth login` first.\n");
247
+ process.exit(1);
248
+ }
249
+ // Stdio transport: read JSON-RPC from stdin, write to stdout
250
+ let buffer = "";
251
+ process.stdin.setEncoding("utf-8");
252
+ process.stdin.on("data", (chunk) => {
253
+ buffer += chunk;
254
+ // Try to parse complete JSON-RPC messages
255
+ while (true) {
256
+ // Look for Content-Length header
257
+ const headerEnd = buffer.indexOf("\r\n\r\n");
258
+ if (headerEnd === -1)
259
+ break;
260
+ const header = buffer.slice(0, headerEnd);
261
+ const contentLengthMatch = header.match(/Content-Length:\s*(\d+)/i);
262
+ if (!contentLengthMatch) {
263
+ // No content-length, try raw JSON
264
+ try {
265
+ const msg = JSON.parse(buffer.trim());
266
+ buffer = "";
267
+ handleMessage(msg);
268
+ }
269
+ catch {
270
+ break;
271
+ }
272
+ continue;
273
+ }
274
+ const contentLength = parseInt(contentLengthMatch[1], 10);
275
+ const bodyStart = headerEnd + 4;
276
+ if (buffer.length < bodyStart + contentLength)
277
+ break;
278
+ const body = buffer.slice(bodyStart, bodyStart + contentLength);
279
+ buffer = buffer.slice(bodyStart + contentLength);
280
+ try {
281
+ const msg = JSON.parse(body);
282
+ handleMessage(msg);
283
+ }
284
+ catch (err) {
285
+ sendResponse({
286
+ jsonrpc: "2.0",
287
+ id: 0,
288
+ error: { code: -32700, message: "Parse error" },
289
+ });
290
+ }
291
+ }
292
+ });
293
+ process.stdin.resume();
294
+ }
295
+ function handleMessage(msg) {
296
+ switch (msg.method) {
297
+ case "initialize":
298
+ sendResponse({
299
+ jsonrpc: "2.0",
300
+ id: msg.id,
301
+ result: {
302
+ protocolVersion: "2024-11-05",
303
+ capabilities: {
304
+ tools: {},
305
+ },
306
+ serverInfo: {
307
+ name: "bland-cli",
308
+ version: "0.1.0",
309
+ },
310
+ },
311
+ });
312
+ break;
313
+ case "notifications/initialized":
314
+ // No response needed for notifications
315
+ break;
316
+ case "tools/list":
317
+ sendResponse({
318
+ jsonrpc: "2.0",
319
+ id: msg.id,
320
+ result: {
321
+ tools: MCP_TOOLS,
322
+ },
323
+ });
324
+ break;
325
+ case "tools/call": {
326
+ const toolName = msg.params.name;
327
+ const toolArgs = (msg.params.arguments) || {};
328
+ handleToolCall(toolName, toolArgs)
329
+ .then((result) => {
330
+ sendResponse({
331
+ jsonrpc: "2.0",
332
+ id: msg.id,
333
+ result: {
334
+ content: [
335
+ {
336
+ type: "text",
337
+ text: JSON.stringify(result, null, 2),
338
+ },
339
+ ],
340
+ },
341
+ });
342
+ })
343
+ .catch((err) => {
344
+ sendResponse({
345
+ jsonrpc: "2.0",
346
+ id: msg.id,
347
+ result: {
348
+ content: [
349
+ {
350
+ type: "text",
351
+ text: `Error: ${err instanceof Error ? err.message : String(err)}`,
352
+ },
353
+ ],
354
+ isError: true,
355
+ },
356
+ });
357
+ });
358
+ break;
359
+ }
360
+ default:
361
+ if (msg.id !== undefined) {
362
+ sendResponse({
363
+ jsonrpc: "2.0",
364
+ id: msg.id,
365
+ error: { code: -32601, message: `Method not found: ${msg.method}` },
366
+ });
367
+ }
368
+ }
369
+ }
370
+ function sendResponse(response) {
371
+ const body = JSON.stringify(response);
372
+ const message = `Content-Length: ${Buffer.byteLength(body)}\r\n\r\n${body}`;
373
+ process.stdout.write(message);
374
+ }
375
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}