Remove mcp-gateway/wave-mcp/src/tools/businesses.ts
This commit is contained in:
parent
199fc34684
commit
1a85cb3078
1 changed files with 0 additions and 191 deletions
|
|
@ -1,191 +0,0 @@
|
||||||
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
||||||
import { z } from "zod";
|
|
||||||
import { WaveClient } from "../services/wave-client.js";
|
|
||||||
import { WaveBusiness } from "../types.js";
|
|
||||||
|
|
||||||
const ResponseFormat = { MARKDOWN: "markdown", JSON: "json" } as const;
|
|
||||||
type ResponseFormat = (typeof ResponseFormat)[keyof typeof ResponseFormat];
|
|
||||||
|
|
||||||
export function registerBusinessTools(
|
|
||||||
server: McpServer,
|
|
||||||
client: WaveClient
|
|
||||||
): void {
|
|
||||||
// ── wave_list_businesses ──────────────────────────────────────────────────
|
|
||||||
|
|
||||||
server.registerTool(
|
|
||||||
"wave_list_businesses",
|
|
||||||
{
|
|
||||||
title: "List Wave Businesses",
|
|
||||||
description: `List all Wave businesses accessible to the authenticated user.
|
|
||||||
|
|
||||||
Returns all business accounts the API token has access to. Most other Wave operations require a businessId, so call this first to discover available businesses.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
- response_format ('markdown' | 'json'): Output format (default: 'markdown')
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
List of businesses with id, name, currency, address, and subscription details.`,
|
|
||||||
inputSchema: z.object({
|
|
||||||
response_format: z
|
|
||||||
.enum(["markdown", "json"])
|
|
||||||
.default("markdown")
|
|
||||||
.describe("Output format: 'markdown' for human-readable or 'json' for machine-readable"),
|
|
||||||
}),
|
|
||||||
annotations: {
|
|
||||||
readOnlyHint: true,
|
|
||||||
destructiveHint: false,
|
|
||||||
idempotentHint: true,
|
|
||||||
openWorldHint: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
async ({ response_format }) => {
|
|
||||||
try {
|
|
||||||
const data = await client.query<{ businesses: { edges: Array<{ node: WaveBusiness }> } }>(`
|
|
||||||
query {
|
|
||||||
businesses(page: 1, pageSize: 100) {
|
|
||||||
edges {
|
|
||||||
node {
|
|
||||||
id
|
|
||||||
name
|
|
||||||
isPersonal
|
|
||||||
organizationalType
|
|
||||||
isClassicAccounting
|
|
||||||
isClassicInvoicing
|
|
||||||
currency { code symbol name }
|
|
||||||
address {
|
|
||||||
addressLine1
|
|
||||||
addressLine2
|
|
||||||
city
|
|
||||||
province { name code }
|
|
||||||
country { name code }
|
|
||||||
postalCode
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`);
|
|
||||||
|
|
||||||
const businesses = data.businesses.edges.map((e) => e.node);
|
|
||||||
|
|
||||||
if (!businesses.length) {
|
|
||||||
return { content: [{ type: "text", text: "No businesses found for this account." }] };
|
|
||||||
}
|
|
||||||
|
|
||||||
let text: string;
|
|
||||||
if (response_format === "json") {
|
|
||||||
text = JSON.stringify({ count: businesses.length, businesses }, null, 2);
|
|
||||||
} else {
|
|
||||||
const lines = [`# Wave Businesses (${businesses.length})`, ""];
|
|
||||||
for (const b of businesses) {
|
|
||||||
lines.push(`## ${b.name}`);
|
|
||||||
lines.push(`- **ID**: ${b.id}`);
|
|
||||||
lines.push(`- **Currency**: ${b.currency.code} (${b.currency.name})`);
|
|
||||||
if (b.address?.city) {
|
|
||||||
const loc = [b.address.city, b.address.province?.code, b.address.country?.code]
|
|
||||||
.filter(Boolean)
|
|
||||||
.join(", ");
|
|
||||||
lines.push(`- **Location**: ${loc}`);
|
|
||||||
}
|
|
||||||
lines.push("");
|
|
||||||
}
|
|
||||||
text = lines.join("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
content: [{ type: "text", text: WaveClient.truncate(text) }],
|
|
||||||
structuredContent: { count: businesses.length, businesses },
|
|
||||||
};
|
|
||||||
} catch (error) {
|
|
||||||
return {
|
|
||||||
content: [{ type: "text", text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
// ── wave_get_business ─────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
server.registerTool(
|
|
||||||
"wave_get_business",
|
|
||||||
{
|
|
||||||
title: "Get Wave Business",
|
|
||||||
description: `Get details for a specific Wave business by ID.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
- businessId (string): The Wave business ID (obtain from wave_list_businesses)
|
|
||||||
- response_format ('markdown' | 'json'): Output format (default: 'markdown')
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
Full business details including name, currency, address, and account settings.`,
|
|
||||||
inputSchema: z.object({
|
|
||||||
businessId: z.string().describe("Wave business ID"),
|
|
||||||
response_format: z
|
|
||||||
.enum(["markdown", "json"])
|
|
||||||
.default("markdown")
|
|
||||||
.describe("Output format"),
|
|
||||||
}),
|
|
||||||
annotations: {
|
|
||||||
readOnlyHint: true,
|
|
||||||
destructiveHint: false,
|
|
||||||
idempotentHint: true,
|
|
||||||
openWorldHint: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
async ({ businessId, response_format }) => {
|
|
||||||
try {
|
|
||||||
const data = await client.query<{ business: WaveBusiness }>(`
|
|
||||||
query($businessId: ID!) {
|
|
||||||
business(id: $businessId) {
|
|
||||||
id name isPersonal organizationalType
|
|
||||||
isClassicAccounting isClassicInvoicing
|
|
||||||
currency { code symbol name }
|
|
||||||
address {
|
|
||||||
addressLine1 addressLine2 city postalCode
|
|
||||||
province { name code }
|
|
||||||
country { name code }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`, { businessId });
|
|
||||||
|
|
||||||
const b = data.business;
|
|
||||||
if (!b) {
|
|
||||||
return { content: [{ type: "text", text: `No business found with ID: ${businessId}` }] };
|
|
||||||
}
|
|
||||||
|
|
||||||
let text: string;
|
|
||||||
if (response_format === "json") {
|
|
||||||
text = JSON.stringify(b, null, 2);
|
|
||||||
} else {
|
|
||||||
const lines = [
|
|
||||||
`# Business: ${b.name}`,
|
|
||||||
"",
|
|
||||||
`- **ID**: ${b.id}`,
|
|
||||||
`- **Currency**: ${b.currency.code} (${b.currency.name})`,
|
|
||||||
`- **Type**: ${b.isPersonal ? "Personal" : (b.organizationalType ?? "Business")}`,
|
|
||||||
];
|
|
||||||
if (b.address) {
|
|
||||||
const addr = b.address;
|
|
||||||
if (addr.addressLine1) lines.push(`- **Address**: ${addr.addressLine1}`);
|
|
||||||
if (addr.addressLine2) lines.push(` ${addr.addressLine2}`);
|
|
||||||
const cityLine = [addr.city, addr.province?.code, addr.postalCode, addr.country?.code]
|
|
||||||
.filter(Boolean)
|
|
||||||
.join(", ");
|
|
||||||
if (cityLine) lines.push(` ${cityLine}`);
|
|
||||||
}
|
|
||||||
text = lines.join("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
content: [{ type: "text", text }],
|
|
||||||
structuredContent: b,
|
|
||||||
};
|
|
||||||
} catch (error) {
|
|
||||||
return {
|
|
||||||
content: [{ type: "text", text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
Loading…
Reference in a new issue