@marcelocorrea/mcp-hotmart-api
Version:
MCP Server para integração com API Hotmart
245 lines • 8.84 kB
JavaScript
#!/usr/bin/env node
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
import { HotmartClient } from "./hotmart-client.js";
// Inicializar servidor MCP
const server = new Server({
name: "hotmart-api",
version: "1.0.0",
}, {
capabilities: {
tools: {},
},
});
// Instância do cliente Hotmart
const hotmartClient = new HotmartClient();
// Lista de ferramentas disponíveis
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [
{
name: "get_products",
description: "Retorna lista de produtos da conta Hotmart",
inputSchema: {
type: "object",
properties: {},
},
},
{
name: "get_product_offers",
description: "Retorna as ofertas de um produto específico (ucode)",
inputSchema: {
type: "object",
properties: {
product_ucode: {
type: "string",
description: "Código único (ucode) do produto",
},
},
required: ["product_ucode"],
},
},
{
name: "get_subscribers",
description: "Retorna lista de assinaturas (subscribers) da conta Hotmart",
inputSchema: {
type: "object",
properties: {
product_id: {
type: "string",
description: "ID do produto para filtrar assinaturas (opcional)",
},
},
},
},
{
name: "get_subscription",
description: "Retorna detalhes de uma assinatura específica",
inputSchema: {
type: "object",
properties: {
subscriber_code: {
type: "string",
description: "Código do assinante",
},
},
required: ["subscriber_code"],
},
},
{
name: "get_sales",
description: "Retorna lista de vendas da conta Hotmart com filtros opcionais",
inputSchema: {
type: "object",
properties: {
start_date: {
type: "number",
description: "Data inicial em timestamp (milissegundos)",
},
end_date: {
type: "number",
description: "Data final em timestamp (milissegundos)",
},
product_id: {
type: "string",
description: "ID do produto para filtrar vendas",
},
},
},
},
{
name: "get_sale_by_transaction",
description: "Busca uma venda específica pelo ID da transação",
inputSchema: {
type: "object",
properties: {
transaction_id: {
type: "string",
description: "ID da transação",
},
},
required: ["transaction_id"],
},
},
{
name: "test_connection",
description: "Testa a conexão com a API Hotmart",
inputSchema: {
type: "object",
properties: {},
},
},
],
};
});
// Handler para execução de ferramentas
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
try {
switch (name) {
case "get_products": {
const products = await hotmartClient.getProducts();
return {
content: [
{
type: "text",
text: JSON.stringify(products, null, 2),
},
],
};
}
case "get_subscribers": {
const productId = args?.product_id;
const subscribers = await hotmartClient.getSubscribers(productId);
return {
content: [
{
type: "text",
text: JSON.stringify(subscribers, null, 2),
},
],
};
}
case "get_product_offers": {
const productUcode = args?.product_ucode;
if (!productUcode) {
throw new Error("product_ucode é obrigatório");
}
const offers = await hotmartClient.getProductOffers(productUcode);
return {
content: [
{
type: "text",
text: JSON.stringify(offers, null, 2),
},
],
};
}
case "get_subscription": {
const subscriberCode = args?.subscriber_code;
if (!subscriberCode) {
throw new Error("subscriber_code é obrigatório");
}
const subscription = await hotmartClient.getSubscription(subscriberCode);
return {
content: [
{
type: "text",
text: JSON.stringify(subscription, null, 2),
},
],
};
}
case "get_sales": {
const startDate = args?.start_date;
const endDate = args?.end_date;
const productId = args?.product_id;
const sales = await hotmartClient.getSales({
startDate,
endDate,
productId,
});
return {
content: [
{
type: "text",
text: JSON.stringify(sales, null, 2),
},
],
};
}
case "get_sale_by_transaction": {
const transactionId = args?.transaction_id;
if (!transactionId) {
throw new Error("transaction_id é obrigatório");
}
const sale = await hotmartClient.getSalesByTransaction(transactionId);
return {
content: [
{
type: "text",
text: JSON.stringify(sale, null, 2),
},
],
};
}
case "test_connection": {
const isConnected = await hotmartClient.testConnection();
return {
content: [
{
type: "text",
text: JSON.stringify({ connected: isConnected }, null, 2),
},
],
};
}
default:
throw new Error(`Ferramenta desconhecida: ${name}`);
}
}
catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
return {
content: [
{
type: "text",
text: JSON.stringify({ error: errorMessage }, null, 2),
},
],
isError: true,
};
}
});
// Iniciar servidor
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("Hotmart MCP Server rodando em stdio");
}
main().catch((error) => {
console.error("Erro fatal no servidor:", error);
process.exit(1);
});
//# sourceMappingURL=index.js.map