@ar-agents/mcp 0.2.0 → 0.3.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - MCP v0.3: ships `@ar-agents/facturacion` as 6th tool registry.
8
+
9
+ The MCP server now exposes 6 packages:
10
+
11
+ - `@ar-agents/identity` (validate_cuit, lookup_cuit_afip)
12
+ - `@ar-agents/identity-attest` (4 attestation tools)
13
+ - `@ar-agents/mercadopago` (41 MP API tools)
14
+ - `@ar-agents/whatsapp` (6 messaging tools)
15
+ - `@ar-agents/banking` (5 CBU/BCRA tools)
16
+ - **NEW: `@ar-agents/facturacion`** (10 WSFE tools — emitir factura, consultar último, catálogos)
17
+
18
+ Auto-detects facturación from env: `AFIP_CUIT_REPRESENTADO` + `AFIP_CERT_PEM/PATH` + `AFIP_KEY_PEM/PATH` (same vars as identity, but the cert must be authorized for the `wsfe` service in addition).
19
+
20
+ Tunables: `WSFE_DEFAULT_PTOVTA`, `WSFE_TIMEOUT_MS`, `WSFE_MAX_RETRIES`.
21
+
22
+ Server version bumped to 0.3.0 in the MCP handshake.
23
+
3
24
  ## 0.2.0
4
25
 
5
26
  ### Minor Changes
package/dist/index.cjs CHANGED
@@ -5,6 +5,7 @@ var stdio_js = require('@modelcontextprotocol/sdk/server/stdio.js');
5
5
  var types_js = require('@modelcontextprotocol/sdk/types.js');
6
6
  var zod = require('zod');
7
7
  var banking = require('@ar-agents/banking');
8
+ var facturacion = require('@ar-agents/facturacion');
8
9
  var identity = require('@ar-agents/identity');
9
10
  var wsaa = require('@ar-agents/identity/wsaa');
10
11
  var identityAttest = require('@ar-agents/identity-attest');
@@ -83,6 +84,57 @@ function describeBankingConfig() {
83
84
  const bcraDisabled = process.env.AR_AGENTS_BCRA_DISABLED?.trim() === "1";
84
85
  return bcraDisabled ? "validate_cbu, lookup_bank_by_code, list_banks, list_psps (BCRA disabled)" : "validate_cbu, lookup_bank_by_code, list_banks, list_psps, lookup_credit_situation (BCRA public API)";
85
86
  }
87
+ function buildFacturacionTools() {
88
+ const wsfe = buildWsfeClient();
89
+ const defaultPtoVta = Number(
90
+ process.env.WSFE_DEFAULT_PTOVTA?.trim() ?? "0"
91
+ );
92
+ const opts = {};
93
+ if (wsfe) opts.wsfe = wsfe;
94
+ if (Number.isFinite(defaultPtoVta) && defaultPtoVta > 0)
95
+ opts.defaultPtoVta = defaultPtoVta;
96
+ return facturacion.facturacionTools(opts);
97
+ }
98
+ function buildWsfeClient() {
99
+ const cuit = process.env.AFIP_CUIT_REPRESENTADO?.trim();
100
+ if (!cuit) return void 0;
101
+ const env = process.env.AFIP_ENV?.trim() ?? "prod";
102
+ const timeout = Number(process.env.WSFE_TIMEOUT_MS?.trim() ?? "30000");
103
+ const retries = Number(process.env.WSFE_MAX_RETRIES?.trim() ?? "1");
104
+ const certPem = process.env.AFIP_CERT_PEM;
105
+ const keyPem = process.env.AFIP_KEY_PEM;
106
+ if (certPem && keyPem) {
107
+ return new facturacion.WsfeClient({
108
+ certPem,
109
+ keyPem,
110
+ cuit,
111
+ env,
112
+ requestTimeoutMs: Number.isFinite(timeout) ? timeout : 3e4,
113
+ maxRetries: Number.isFinite(retries) ? retries : 1
114
+ });
115
+ }
116
+ const certPath = process.env.AFIP_CERT_PATH?.trim();
117
+ const keyPath = process.env.AFIP_KEY_PATH?.trim();
118
+ if (certPath && keyPath) {
119
+ return new facturacion.WsfeClient({
120
+ certPath,
121
+ keyPath,
122
+ cuit,
123
+ env,
124
+ requestTimeoutMs: Number.isFinite(timeout) ? timeout : 3e4,
125
+ maxRetries: Number.isFinite(retries) ? retries : 1
126
+ });
127
+ }
128
+ return void 0;
129
+ }
130
+ function describeFacturacionConfig() {
131
+ const cuit = process.env.AFIP_CUIT_REPRESENTADO?.trim();
132
+ if (!cuit) return "no configurado (faltan AFIP_CUIT_REPRESENTADO + cert)";
133
+ const certConfigured = !!process.env.AFIP_CERT_PEM || !!process.env.AFIP_CERT_PATH;
134
+ if (!certConfigured) return "no configurado (falta AFIP_CERT_PEM o AFIP_CERT_PATH)";
135
+ const ptovta = process.env.WSFE_DEFAULT_PTOVTA?.trim();
136
+ return `WSFE habilitado (CUIT ${cuit}${ptovta ? `, PtoVta ${ptovta}` : ""})`;
137
+ }
86
138
  function buildIdentityTools() {
87
139
  const afip = buildAfipAdapter();
88
140
  return identity.identityTools(afip ? { afip } : {});
@@ -199,14 +251,15 @@ function describeMercadoPagoConfig() {
199
251
 
200
252
  // src/server.ts
201
253
  var SERVER_NAME = "ar-agents";
202
- var SERVER_VERSION = "0.2.0";
254
+ var SERVER_VERSION = "0.3.0";
203
255
  async function createServer() {
204
256
  const adapter = combineToolSets([
205
257
  buildIdentityTools(),
206
258
  buildMercadoPagoTools(),
207
259
  buildWhatsAppTools(),
208
260
  buildIdentityAttestTools(),
209
- buildBankingTools()
261
+ buildBankingTools(),
262
+ buildFacturacionTools()
210
263
  ]);
211
264
  const summary = [
212
265
  `${SERVER_NAME}@${SERVER_VERSION} starting with ${adapter.tools.length} tools registered:`,
@@ -214,7 +267,8 @@ async function createServer() {
214
267
  ` mercadopago \u2192 ${describeMercadoPagoConfig()}`,
215
268
  ` whatsapp \u2192 ${describeWhatsAppConfig()}`,
216
269
  ` identity-attest \u2192 ${describeIdentityAttestConfig()}`,
217
- ` banking \u2192 ${describeBankingConfig()}`
270
+ ` banking \u2192 ${describeBankingConfig()}`,
271
+ ` facturacion \u2192 ${describeFacturacionConfig()}`
218
272
  ];
219
273
  const server = new index_js.Server(
220
274
  { name: SERVER_NAME, version: SERVER_VERSION },
@@ -250,6 +304,7 @@ async function startStdio() {
250
304
 
251
305
  exports.adaptToolSetToMcp = adaptToolSetToMcp;
252
306
  exports.buildBankingTools = buildBankingTools;
307
+ exports.buildFacturacionTools = buildFacturacionTools;
253
308
  exports.buildIdentityAttestTools = buildIdentityAttestTools;
254
309
  exports.buildIdentityTools = buildIdentityTools;
255
310
  exports.buildMercadoPagoTools = buildMercadoPagoTools;
@@ -257,6 +312,7 @@ exports.buildWhatsAppTools = buildWhatsAppTools;
257
312
  exports.combineToolSets = combineToolSets;
258
313
  exports.createServer = createServer;
259
314
  exports.describeBankingConfig = describeBankingConfig;
315
+ exports.describeFacturacionConfig = describeFacturacionConfig;
260
316
  exports.describeIdentityAttestConfig = describeIdentityAttestConfig;
261
317
  exports.describeIdentityConfig = describeIdentityConfig;
262
318
  exports.describeMercadoPagoConfig = describeMercadoPagoConfig;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapter.ts","../src/registries/banking.ts","../src/registries/identity.ts","../src/registries/whatsapp.ts","../src/registries/identity-attest.ts","../src/registries/mercadopago.ts","../src/server.ts"],"names":["z","bankingTools","BcraPublicApiAdapter","identityTools","WsaaWscdcAfipPadronAdapter","whatsappTools","WhatsAppClient","WhatsAppOtpAdapter","EmailMagicLinkAdapter","AttestationClient","identityAttestTools","MercadoPagoClient","mercadoPagoTools","InMemoryStateAdapter","Server","ListToolsRequestSchema","CallToolRequestSchema","StdioServerTransport"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ToolSet } from \"ai\";\nimport { z } from \"zod\";\n\n/**\n * Convert a Vercel AI SDK ToolSet to MCP-compatible tool definitions.\n *\n * Vercel AI SDK's `tool()` shape:\n * { description, inputSchema: ZodSchema, execute: (args) => result }\n *\n * MCP's tool shape:\n * { name, description, inputSchema: JSONSchema }\n * + a separate handler that takes (name, args) and returns the result\n */\n\nexport interface McpTool {\n name: string;\n description: string;\n inputSchema: object; // JSON Schema\n}\n\nexport interface McpAdapter {\n /** All MCP tool definitions (for ListTools response). */\n tools: McpTool[];\n /** Handler for CallTool — looks up the original Vercel AI SDK tool and runs execute. */\n call: (name: string, args: unknown) => Promise<unknown>;\n}\n\n/**\n * Bridge a Vercel AI SDK ToolSet → MCP tools + dispatcher.\n *\n * Throws on unknown tool name or if execute is missing (safety: every Vercel\n * AI SDK tool ships with `execute` for server-side flows, which is what\n * MCP needs).\n */\nexport function adaptToolSetToMcp(toolSet: ToolSet): McpAdapter {\n const tools: McpTool[] = [];\n const lookup = new Map<string, (args: unknown) => Promise<unknown>>();\n\n for (const [name, tool] of Object.entries(toolSet)) {\n if (!tool || typeof tool !== \"object\") continue;\n const description =\n \"description\" in tool && typeof tool.description === \"string\" ? tool.description : \"\";\n const inputSchema =\n \"inputSchema\" in tool && tool.inputSchema\n ? (z.toJSONSchema(tool.inputSchema as z.ZodType) as object)\n : { type: \"object\", properties: {}, additionalProperties: false };\n\n tools.push({ name, description, inputSchema });\n\n const exec = \"execute\" in tool ? (tool.execute as (args: unknown) => Promise<unknown>) : null;\n if (!exec) {\n // Server-side execution required for MCP; skip tools without execute.\n continue;\n }\n lookup.set(name, exec);\n }\n\n return {\n tools,\n call: async (name, args) => {\n const fn = lookup.get(name);\n if (!fn) {\n throw new Error(`Tool \"${name}\" not found or has no execute fn (MCP requires server-side tools).`);\n }\n return fn(args);\n },\n };\n}\n\n/**\n * Combine multiple Vercel AI SDK ToolSets into a single McpAdapter. Tool\n * name collisions throw at adapter-build time.\n */\nexport function combineToolSets(toolSets: Array<ToolSet | null>): McpAdapter {\n const tools: McpTool[] = [];\n const lookup = new Map<string, (args: unknown) => Promise<unknown>>();\n const seen = new Set<string>();\n\n for (const ts of toolSets) {\n if (!ts) continue;\n const adapter = adaptToolSetToMcp(ts);\n for (const tool of adapter.tools) {\n if (seen.has(tool.name)) {\n throw new Error(\n `Tool name collision: \"${tool.name}\" appears in multiple registered tool sets. Rename one or skip a registry.`,\n );\n }\n seen.add(tool.name);\n tools.push(tool);\n // Bind this specific tool's call through the source adapter\n const sourceAdapter = adapter;\n const toolName = tool.name;\n lookup.set(toolName, (args: unknown) => sourceAdapter.call(toolName, args));\n }\n }\n\n return {\n tools,\n call: async (name, args) => {\n const fn = lookup.get(name);\n if (!fn) throw new Error(`Tool \"${name}\" not found in combined set.`);\n return fn(args);\n },\n };\n}\n","import {\n bankingTools,\n BcraPublicApiAdapter,\n type BcraDeudaAdapter,\n} from \"@ar-agents/banking\";\nimport type { ToolSet } from \"ai\";\n\n/**\n * Build the @ar-agents/banking tool set.\n *\n * Pure-algorithm tools (validate_cbu, lookup_bank_by_code, list_banks,\n * list_psps) are ALWAYS available — no env vars required.\n *\n * The BCRA Central de Deudores tool is wired to `BcraPublicApiAdapter`\n * by default (BCRA's public REST API needs no auth). To opt out, set\n * `AR_AGENTS_BCRA_DISABLED=1` in env — the tool then returns\n * `{ available: false, error: \"<setup instructions>\" }`.\n */\nexport function buildBankingTools(): ToolSet {\n const bcra = buildBcraAdapter();\n return bankingTools(bcra ? { bcra } : {}) as ToolSet;\n}\n\nfunction buildBcraAdapter(): BcraDeudaAdapter | undefined {\n if (process.env.AR_AGENTS_BCRA_DISABLED?.trim() === \"1\") return undefined;\n const timeout = Number(process.env.BCRA_TIMEOUT_MS?.trim() ?? \"30000\");\n const retries = Number(process.env.BCRA_MAX_RETRIES?.trim() ?? \"1\");\n return new BcraPublicApiAdapter({\n requestTimeoutMs: Number.isFinite(timeout) ? timeout : 30_000,\n maxRetries: Number.isFinite(retries) ? retries : 1,\n });\n}\n\nexport function describeBankingConfig(): string {\n const bcraDisabled = process.env.AR_AGENTS_BCRA_DISABLED?.trim() === \"1\";\n return bcraDisabled\n ? \"validate_cbu, lookup_bank_by_code, list_banks, list_psps (BCRA disabled)\"\n : \"validate_cbu, lookup_bank_by_code, list_banks, list_psps, lookup_credit_situation (BCRA public API)\";\n}\n","import { identityTools, type AfipPadronAdapter } from \"@ar-agents/identity\";\nimport { WsaaWscdcAfipPadronAdapter } from \"@ar-agents/identity/wsaa\";\nimport type { ToolSet } from \"ai\";\n\n/**\n * Build the @ar-agents/identity tool set from environment variables.\n * Returns null when AFIP env vars are missing (the algorithm-only `validate_cuit`\n * is always available; lookup_cuit_afip falls back to UnconfiguredAfipPadronAdapter).\n */\nexport function buildIdentityTools(): ToolSet {\n const afip = buildAfipAdapter();\n return identityTools(afip ? { afip } : {}) as ToolSet;\n}\n\nfunction buildAfipAdapter(): AfipPadronAdapter | undefined {\n const cuit = process.env.AFIP_CUIT_REPRESENTADO?.trim();\n if (!cuit) return undefined;\n const env = (process.env.AFIP_ENV?.trim() ?? \"prod\") as \"homo\" | \"prod\";\n const certPem = process.env.AFIP_CERT_PEM;\n const keyPem = process.env.AFIP_KEY_PEM;\n if (certPem && keyPem) {\n return new WsaaWscdcAfipPadronAdapter({ certPem, keyPem, cuitRepresentado: cuit, env });\n }\n const certPath = process.env.AFIP_CERT_PATH?.trim();\n const keyPath = process.env.AFIP_KEY_PATH?.trim();\n if (certPath && keyPath) {\n return new WsaaWscdcAfipPadronAdapter({ certPath, keyPath, cuitRepresentado: cuit, env });\n }\n return undefined;\n}\n\nexport function describeIdentityConfig(): string {\n const cuit = process.env.AFIP_CUIT_REPRESENTADO?.trim();\n if (!cuit) return \"validate_cuit only (no AFIP cert configured)\";\n const certConfigured =\n !!process.env.AFIP_CERT_PEM || !!process.env.AFIP_CERT_PATH;\n return certConfigured\n ? `validate_cuit + lookup_cuit_afip (AFIP cert configured for CUIT ${cuit})`\n : `validate_cuit only (cert not configured)`;\n}\n","import { WhatsAppClient, whatsappTools } from \"@ar-agents/whatsapp\";\nimport type { ToolSet } from \"ai\";\n\nexport function buildWhatsAppTools(): ToolSet | null {\n const accessToken = process.env.WA_ACCESS_TOKEN?.trim();\n const phoneNumberId = process.env.WA_PHONE_NUMBER_ID?.trim();\n if (!accessToken || !phoneNumberId) return null;\n return whatsappTools(new WhatsAppClient({ accessToken, phoneNumberId })) as ToolSet;\n}\n\nexport function describeWhatsAppConfig(): string {\n const accessToken = process.env.WA_ACCESS_TOKEN?.trim();\n const phoneNumberId = process.env.WA_PHONE_NUMBER_ID?.trim();\n if (!accessToken || !phoneNumberId)\n return \"not configured (set WA_ACCESS_TOKEN + WA_PHONE_NUMBER_ID)\";\n return `phone_number_id=${phoneNumberId.slice(0, 6)}…`;\n}\n\n/** Returns the configured client, used by identity-attest's WhatsAppOtpAdapter. */\nexport function getWhatsAppClient(): WhatsAppClient | null {\n const accessToken = process.env.WA_ACCESS_TOKEN?.trim();\n const phoneNumberId = process.env.WA_PHONE_NUMBER_ID?.trim();\n if (!accessToken || !phoneNumberId) return null;\n return new WhatsAppClient({ accessToken, phoneNumberId });\n}\n","import {\n AttestationClient,\n identityAttestTools,\n WhatsAppOtpAdapter,\n EmailMagicLinkAdapter,\n type EmailSender,\n} from \"@ar-agents/identity-attest\";\nimport type { ToolSet } from \"ai\";\nimport { getWhatsAppClient } from \"./whatsapp\";\n\n/**\n * Build @ar-agents/identity-attest tools if ATTEST_SIGNING_SECRET is set\n * and at least one adapter can be configured (WhatsApp client present\n * OR email sender configured via SMTP_URL / RESEND_API_KEY).\n */\nexport function buildIdentityAttestTools(): ToolSet | null {\n const signingSecret = process.env.ATTEST_SIGNING_SECRET?.trim();\n if (!signingSecret) return null;\n\n const adapters: Record<string, ConstructorParameters<typeof AttestationClient>[0][\"adapters\"][string]> = {};\n\n // WhatsApp OTP — requires WhatsApp client\n const wa = getWhatsAppClient();\n if (wa) {\n adapters[\"whatsapp_otp\"] = new WhatsAppOtpAdapter({\n whatsappClient: wa,\n businessName: process.env.BUSINESS_NAME?.trim() ?? \"this app\",\n });\n }\n\n // Email magic-link — requires Resend API key + callback URL\n const resendKey = process.env.RESEND_API_KEY?.trim();\n const callbackUrl = process.env.ATTEST_CALLBACK_URL?.trim();\n if (resendKey && callbackUrl) {\n const fromEmail = process.env.ATTEST_FROM_EMAIL?.trim() ?? \"noreply@example.com\";\n const sender: EmailSender = async ({ to, subject, html, text }) => {\n const res = await fetch(\"https://api.resend.com/emails\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${resendKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ from: fromEmail, to, subject, html, text }),\n });\n if (!res.ok) {\n throw new Error(`Resend send failed: ${res.status} ${await res.text()}`);\n }\n };\n adapters[\"email_magic_link\"] = new EmailMagicLinkAdapter({\n sender,\n callbackBaseUrl: callbackUrl,\n businessName: process.env.BUSINESS_NAME?.trim() ?? \"this app\",\n });\n }\n\n if (Object.keys(adapters).length === 0) return null;\n\n const client = new AttestationClient({ signingSecret, adapters });\n return identityAttestTools(client) as ToolSet;\n}\n\nexport function describeIdentityAttestConfig(): string {\n const signingSecret = process.env.ATTEST_SIGNING_SECRET?.trim();\n if (!signingSecret) return \"not configured (set ATTEST_SIGNING_SECRET)\";\n const adapters: string[] = [];\n if (getWhatsAppClient()) adapters.push(\"whatsapp_otp\");\n if (process.env.RESEND_API_KEY?.trim() && process.env.ATTEST_CALLBACK_URL?.trim())\n adapters.push(\"email_magic_link\");\n if (adapters.length === 0)\n return \"configured but no adapters (set WhatsApp creds and/or RESEND_API_KEY + ATTEST_CALLBACK_URL)\";\n return adapters.join(\", \");\n}\n","import {\n InMemoryStateAdapter,\n MercadoPagoClient,\n mercadoPagoTools,\n} from \"@ar-agents/mercadopago\";\nimport type { ToolSet } from \"ai\";\n\n/**\n * Build @ar-agents/mercadopago tools if MP_ACCESS_TOKEN is set.\n * Returns null when not configured.\n */\nexport function buildMercadoPagoTools(): ToolSet | null {\n const accessToken = process.env.MP_ACCESS_TOKEN?.trim();\n if (!accessToken) return null;\n const client = new MercadoPagoClient({ accessToken });\n const backUrl = process.env.MP_BACK_URL?.trim() ?? \"https://example.com/done\";\n return mercadoPagoTools(client, {\n state: new InMemoryStateAdapter(),\n backUrl,\n }) as ToolSet;\n}\n\nexport function describeMercadoPagoConfig(): string {\n const token = process.env.MP_ACCESS_TOKEN?.trim();\n if (!token) return \"not configured (set MP_ACCESS_TOKEN)\";\n const isTest = token.startsWith(\"TEST-\");\n const backUrl = process.env.MP_BACK_URL?.trim();\n return `${isTest ? \"TEST\" : \"PROD\"} mode${backUrl ? ` · back_url=${backUrl}` : \" · using default back_url\"}`;\n}\n","import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { combineToolSets } from \"./adapter\";\nimport { buildBankingTools, describeBankingConfig } from \"./registries/banking\";\nimport { buildIdentityTools, describeIdentityConfig } from \"./registries/identity\";\nimport {\n buildIdentityAttestTools,\n describeIdentityAttestConfig,\n} from \"./registries/identity-attest\";\nimport {\n buildMercadoPagoTools,\n describeMercadoPagoConfig,\n} from \"./registries/mercadopago\";\nimport { buildWhatsAppTools, describeWhatsAppConfig } from \"./registries/whatsapp\";\n\nconst SERVER_NAME = \"ar-agents\";\nconst SERVER_VERSION = \"0.2.0\";\n\n/**\n * Build the @ar-agents/mcp server. Inspects environment variables to decide\n * which package's tools to register. Always registers @ar-agents/identity\n * (algorithm-only `validate_cuit` works without any env vars).\n */\nexport async function createServer(): Promise<{ server: Server; summary: string[] }> {\n const adapter = combineToolSets([\n buildIdentityTools(),\n buildMercadoPagoTools(),\n buildWhatsAppTools(),\n buildIdentityAttestTools(),\n buildBankingTools(),\n ]);\n\n const summary = [\n `${SERVER_NAME}@${SERVER_VERSION} starting with ${adapter.tools.length} tools registered:`,\n ` identity → ${describeIdentityConfig()}`,\n ` mercadopago → ${describeMercadoPagoConfig()}`,\n ` whatsapp → ${describeWhatsAppConfig()}`,\n ` identity-attest → ${describeIdentityAttestConfig()}`,\n ` banking → ${describeBankingConfig()}`,\n ];\n\n const server = new Server(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {} } },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: adapter.tools,\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n try {\n const result = await adapter.call(name, args ?? {});\n return {\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: \"text\", text: `Error calling ${name}: ${msg}` }],\n isError: true,\n };\n }\n });\n\n return { server, summary };\n}\n\n/**\n * Start the MCP server over stdio. Called by the CLI binary.\n * Logs the registered-tools summary to stderr (stdout is reserved for MCP\n * protocol messages).\n */\nexport async function startStdio(): Promise<void> {\n const { server, summary } = await createServer();\n for (const line of summary) console.error(line);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(\"ar-agents MCP server connected via stdio\");\n}\n"]}
1
+ {"version":3,"sources":["../src/adapter.ts","../src/registries/banking.ts","../src/registries/facturacion.ts","../src/registries/identity.ts","../src/registries/whatsapp.ts","../src/registries/identity-attest.ts","../src/registries/mercadopago.ts","../src/server.ts"],"names":["z","bankingTools","BcraPublicApiAdapter","facturacionTools","WsfeClient","identityTools","WsaaWscdcAfipPadronAdapter","whatsappTools","WhatsAppClient","WhatsAppOtpAdapter","EmailMagicLinkAdapter","AttestationClient","identityAttestTools","MercadoPagoClient","mercadoPagoTools","InMemoryStateAdapter","Server","ListToolsRequestSchema","CallToolRequestSchema","StdioServerTransport"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ToolSet } from \"ai\";\nimport { z } from \"zod\";\n\n/**\n * Convert a Vercel AI SDK ToolSet to MCP-compatible tool definitions.\n *\n * Vercel AI SDK's `tool()` shape:\n * { description, inputSchema: ZodSchema, execute: (args) => result }\n *\n * MCP's tool shape:\n * { name, description, inputSchema: JSONSchema }\n * + a separate handler that takes (name, args) and returns the result\n */\n\nexport interface McpTool {\n name: string;\n description: string;\n inputSchema: object; // JSON Schema\n}\n\nexport interface McpAdapter {\n /** All MCP tool definitions (for ListTools response). */\n tools: McpTool[];\n /** Handler for CallTool — looks up the original Vercel AI SDK tool and runs execute. */\n call: (name: string, args: unknown) => Promise<unknown>;\n}\n\n/**\n * Bridge a Vercel AI SDK ToolSet → MCP tools + dispatcher.\n *\n * Throws on unknown tool name or if execute is missing (safety: every Vercel\n * AI SDK tool ships with `execute` for server-side flows, which is what\n * MCP needs).\n */\nexport function adaptToolSetToMcp(toolSet: ToolSet): McpAdapter {\n const tools: McpTool[] = [];\n const lookup = new Map<string, (args: unknown) => Promise<unknown>>();\n\n for (const [name, tool] of Object.entries(toolSet)) {\n if (!tool || typeof tool !== \"object\") continue;\n const description =\n \"description\" in tool && typeof tool.description === \"string\" ? tool.description : \"\";\n const inputSchema =\n \"inputSchema\" in tool && tool.inputSchema\n ? (z.toJSONSchema(tool.inputSchema as z.ZodType) as object)\n : { type: \"object\", properties: {}, additionalProperties: false };\n\n tools.push({ name, description, inputSchema });\n\n const exec = \"execute\" in tool ? (tool.execute as (args: unknown) => Promise<unknown>) : null;\n if (!exec) {\n // Server-side execution required for MCP; skip tools without execute.\n continue;\n }\n lookup.set(name, exec);\n }\n\n return {\n tools,\n call: async (name, args) => {\n const fn = lookup.get(name);\n if (!fn) {\n throw new Error(`Tool \"${name}\" not found or has no execute fn (MCP requires server-side tools).`);\n }\n return fn(args);\n },\n };\n}\n\n/**\n * Combine multiple Vercel AI SDK ToolSets into a single McpAdapter. Tool\n * name collisions throw at adapter-build time.\n */\nexport function combineToolSets(toolSets: Array<ToolSet | null>): McpAdapter {\n const tools: McpTool[] = [];\n const lookup = new Map<string, (args: unknown) => Promise<unknown>>();\n const seen = new Set<string>();\n\n for (const ts of toolSets) {\n if (!ts) continue;\n const adapter = adaptToolSetToMcp(ts);\n for (const tool of adapter.tools) {\n if (seen.has(tool.name)) {\n throw new Error(\n `Tool name collision: \"${tool.name}\" appears in multiple registered tool sets. Rename one or skip a registry.`,\n );\n }\n seen.add(tool.name);\n tools.push(tool);\n // Bind this specific tool's call through the source adapter\n const sourceAdapter = adapter;\n const toolName = tool.name;\n lookup.set(toolName, (args: unknown) => sourceAdapter.call(toolName, args));\n }\n }\n\n return {\n tools,\n call: async (name, args) => {\n const fn = lookup.get(name);\n if (!fn) throw new Error(`Tool \"${name}\" not found in combined set.`);\n return fn(args);\n },\n };\n}\n","import {\n bankingTools,\n BcraPublicApiAdapter,\n type BcraDeudaAdapter,\n} from \"@ar-agents/banking\";\nimport type { ToolSet } from \"ai\";\n\n/**\n * Build the @ar-agents/banking tool set.\n *\n * Pure-algorithm tools (validate_cbu, lookup_bank_by_code, list_banks,\n * list_psps) are ALWAYS available — no env vars required.\n *\n * The BCRA Central de Deudores tool is wired to `BcraPublicApiAdapter`\n * by default (BCRA's public REST API needs no auth). To opt out, set\n * `AR_AGENTS_BCRA_DISABLED=1` in env — the tool then returns\n * `{ available: false, error: \"<setup instructions>\" }`.\n */\nexport function buildBankingTools(): ToolSet {\n const bcra = buildBcraAdapter();\n return bankingTools(bcra ? { bcra } : {}) as ToolSet;\n}\n\nfunction buildBcraAdapter(): BcraDeudaAdapter | undefined {\n if (process.env.AR_AGENTS_BCRA_DISABLED?.trim() === \"1\") return undefined;\n const timeout = Number(process.env.BCRA_TIMEOUT_MS?.trim() ?? \"30000\");\n const retries = Number(process.env.BCRA_MAX_RETRIES?.trim() ?? \"1\");\n return new BcraPublicApiAdapter({\n requestTimeoutMs: Number.isFinite(timeout) ? timeout : 30_000,\n maxRetries: Number.isFinite(retries) ? retries : 1,\n });\n}\n\nexport function describeBankingConfig(): string {\n const bcraDisabled = process.env.AR_AGENTS_BCRA_DISABLED?.trim() === \"1\";\n return bcraDisabled\n ? \"validate_cbu, lookup_bank_by_code, list_banks, list_psps (BCRA disabled)\"\n : \"validate_cbu, lookup_bank_by_code, list_banks, list_psps, lookup_credit_situation (BCRA public API)\";\n}\n","import { facturacionTools, WsfeClient } from \"@ar-agents/facturacion\";\nimport type { ToolSet } from \"ai\";\n\n/**\n * Build the @ar-agents/facturacion tool set from environment variables.\n *\n * AFIP cert + key + CUIT required (same as @ar-agents/identity, but the\n * service must be authorized for `wsfe` in addition to whatever padron\n * service identity uses). When the env vars are missing, the tools return\n * `{ available: false, error: <setup instructions> }` instead of crashing —\n * MCP host can show the user what to set.\n *\n * # Env vars\n *\n * - `AFIP_CUIT_REPRESENTADO` (required)\n * - `AFIP_CERT_PEM` + `AFIP_KEY_PEM` (preferred for serverless / MCP) OR\n * - `AFIP_CERT_PATH` + `AFIP_KEY_PATH` (for local dev)\n * - `AFIP_ENV` — \"homo\" | \"prod\" (default \"prod\")\n * - `WSFE_DEFAULT_PTOVTA` — default punto de venta (optional, recommended for\n * single-PtoVta SaaS so agents don't have to remember it)\n * - `WSFE_TIMEOUT_MS` — default 30000\n * - `WSFE_MAX_RETRIES` — default 1\n */\nexport function buildFacturacionTools(): ToolSet {\n const wsfe = buildWsfeClient();\n const defaultPtoVta = Number(\n process.env.WSFE_DEFAULT_PTOVTA?.trim() ?? \"0\",\n );\n const opts: Parameters<typeof facturacionTools>[0] = {};\n if (wsfe) opts.wsfe = wsfe;\n if (Number.isFinite(defaultPtoVta) && defaultPtoVta > 0)\n opts.defaultPtoVta = defaultPtoVta;\n return facturacionTools(opts) as ToolSet;\n}\n\nfunction buildWsfeClient(): WsfeClient | undefined {\n const cuit = process.env.AFIP_CUIT_REPRESENTADO?.trim();\n if (!cuit) return undefined;\n const env = (process.env.AFIP_ENV?.trim() ?? \"prod\") as \"homo\" | \"prod\";\n const timeout = Number(process.env.WSFE_TIMEOUT_MS?.trim() ?? \"30000\");\n const retries = Number(process.env.WSFE_MAX_RETRIES?.trim() ?? \"1\");\n const certPem = process.env.AFIP_CERT_PEM;\n const keyPem = process.env.AFIP_KEY_PEM;\n if (certPem && keyPem) {\n return new WsfeClient({\n certPem,\n keyPem,\n cuit,\n env,\n requestTimeoutMs: Number.isFinite(timeout) ? timeout : 30_000,\n maxRetries: Number.isFinite(retries) ? retries : 1,\n });\n }\n const certPath = process.env.AFIP_CERT_PATH?.trim();\n const keyPath = process.env.AFIP_KEY_PATH?.trim();\n if (certPath && keyPath) {\n return new WsfeClient({\n certPath,\n keyPath,\n cuit,\n env,\n requestTimeoutMs: Number.isFinite(timeout) ? timeout : 30_000,\n maxRetries: Number.isFinite(retries) ? retries : 1,\n });\n }\n return undefined;\n}\n\nexport function describeFacturacionConfig(): string {\n const cuit = process.env.AFIP_CUIT_REPRESENTADO?.trim();\n if (!cuit) return \"no configurado (faltan AFIP_CUIT_REPRESENTADO + cert)\";\n const certConfigured =\n !!process.env.AFIP_CERT_PEM || !!process.env.AFIP_CERT_PATH;\n if (!certConfigured) return \"no configurado (falta AFIP_CERT_PEM o AFIP_CERT_PATH)\";\n const ptovta = process.env.WSFE_DEFAULT_PTOVTA?.trim();\n return `WSFE habilitado (CUIT ${cuit}${ptovta ? `, PtoVta ${ptovta}` : \"\"})`;\n}\n","import { identityTools, type AfipPadronAdapter } from \"@ar-agents/identity\";\nimport { WsaaWscdcAfipPadronAdapter } from \"@ar-agents/identity/wsaa\";\nimport type { ToolSet } from \"ai\";\n\n/**\n * Build the @ar-agents/identity tool set from environment variables.\n * Returns null when AFIP env vars are missing (the algorithm-only `validate_cuit`\n * is always available; lookup_cuit_afip falls back to UnconfiguredAfipPadronAdapter).\n */\nexport function buildIdentityTools(): ToolSet {\n const afip = buildAfipAdapter();\n return identityTools(afip ? { afip } : {}) as ToolSet;\n}\n\nfunction buildAfipAdapter(): AfipPadronAdapter | undefined {\n const cuit = process.env.AFIP_CUIT_REPRESENTADO?.trim();\n if (!cuit) return undefined;\n const env = (process.env.AFIP_ENV?.trim() ?? \"prod\") as \"homo\" | \"prod\";\n const certPem = process.env.AFIP_CERT_PEM;\n const keyPem = process.env.AFIP_KEY_PEM;\n if (certPem && keyPem) {\n return new WsaaWscdcAfipPadronAdapter({ certPem, keyPem, cuitRepresentado: cuit, env });\n }\n const certPath = process.env.AFIP_CERT_PATH?.trim();\n const keyPath = process.env.AFIP_KEY_PATH?.trim();\n if (certPath && keyPath) {\n return new WsaaWscdcAfipPadronAdapter({ certPath, keyPath, cuitRepresentado: cuit, env });\n }\n return undefined;\n}\n\nexport function describeIdentityConfig(): string {\n const cuit = process.env.AFIP_CUIT_REPRESENTADO?.trim();\n if (!cuit) return \"validate_cuit only (no AFIP cert configured)\";\n const certConfigured =\n !!process.env.AFIP_CERT_PEM || !!process.env.AFIP_CERT_PATH;\n return certConfigured\n ? `validate_cuit + lookup_cuit_afip (AFIP cert configured for CUIT ${cuit})`\n : `validate_cuit only (cert not configured)`;\n}\n","import { WhatsAppClient, whatsappTools } from \"@ar-agents/whatsapp\";\nimport type { ToolSet } from \"ai\";\n\nexport function buildWhatsAppTools(): ToolSet | null {\n const accessToken = process.env.WA_ACCESS_TOKEN?.trim();\n const phoneNumberId = process.env.WA_PHONE_NUMBER_ID?.trim();\n if (!accessToken || !phoneNumberId) return null;\n return whatsappTools(new WhatsAppClient({ accessToken, phoneNumberId })) as ToolSet;\n}\n\nexport function describeWhatsAppConfig(): string {\n const accessToken = process.env.WA_ACCESS_TOKEN?.trim();\n const phoneNumberId = process.env.WA_PHONE_NUMBER_ID?.trim();\n if (!accessToken || !phoneNumberId)\n return \"not configured (set WA_ACCESS_TOKEN + WA_PHONE_NUMBER_ID)\";\n return `phone_number_id=${phoneNumberId.slice(0, 6)}…`;\n}\n\n/** Returns the configured client, used by identity-attest's WhatsAppOtpAdapter. */\nexport function getWhatsAppClient(): WhatsAppClient | null {\n const accessToken = process.env.WA_ACCESS_TOKEN?.trim();\n const phoneNumberId = process.env.WA_PHONE_NUMBER_ID?.trim();\n if (!accessToken || !phoneNumberId) return null;\n return new WhatsAppClient({ accessToken, phoneNumberId });\n}\n","import {\n AttestationClient,\n identityAttestTools,\n WhatsAppOtpAdapter,\n EmailMagicLinkAdapter,\n type EmailSender,\n} from \"@ar-agents/identity-attest\";\nimport type { ToolSet } from \"ai\";\nimport { getWhatsAppClient } from \"./whatsapp\";\n\n/**\n * Build @ar-agents/identity-attest tools if ATTEST_SIGNING_SECRET is set\n * and at least one adapter can be configured (WhatsApp client present\n * OR email sender configured via SMTP_URL / RESEND_API_KEY).\n */\nexport function buildIdentityAttestTools(): ToolSet | null {\n const signingSecret = process.env.ATTEST_SIGNING_SECRET?.trim();\n if (!signingSecret) return null;\n\n const adapters: Record<string, ConstructorParameters<typeof AttestationClient>[0][\"adapters\"][string]> = {};\n\n // WhatsApp OTP — requires WhatsApp client\n const wa = getWhatsAppClient();\n if (wa) {\n adapters[\"whatsapp_otp\"] = new WhatsAppOtpAdapter({\n whatsappClient: wa,\n businessName: process.env.BUSINESS_NAME?.trim() ?? \"this app\",\n });\n }\n\n // Email magic-link — requires Resend API key + callback URL\n const resendKey = process.env.RESEND_API_KEY?.trim();\n const callbackUrl = process.env.ATTEST_CALLBACK_URL?.trim();\n if (resendKey && callbackUrl) {\n const fromEmail = process.env.ATTEST_FROM_EMAIL?.trim() ?? \"noreply@example.com\";\n const sender: EmailSender = async ({ to, subject, html, text }) => {\n const res = await fetch(\"https://api.resend.com/emails\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${resendKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ from: fromEmail, to, subject, html, text }),\n });\n if (!res.ok) {\n throw new Error(`Resend send failed: ${res.status} ${await res.text()}`);\n }\n };\n adapters[\"email_magic_link\"] = new EmailMagicLinkAdapter({\n sender,\n callbackBaseUrl: callbackUrl,\n businessName: process.env.BUSINESS_NAME?.trim() ?? \"this app\",\n });\n }\n\n if (Object.keys(adapters).length === 0) return null;\n\n const client = new AttestationClient({ signingSecret, adapters });\n return identityAttestTools(client) as ToolSet;\n}\n\nexport function describeIdentityAttestConfig(): string {\n const signingSecret = process.env.ATTEST_SIGNING_SECRET?.trim();\n if (!signingSecret) return \"not configured (set ATTEST_SIGNING_SECRET)\";\n const adapters: string[] = [];\n if (getWhatsAppClient()) adapters.push(\"whatsapp_otp\");\n if (process.env.RESEND_API_KEY?.trim() && process.env.ATTEST_CALLBACK_URL?.trim())\n adapters.push(\"email_magic_link\");\n if (adapters.length === 0)\n return \"configured but no adapters (set WhatsApp creds and/or RESEND_API_KEY + ATTEST_CALLBACK_URL)\";\n return adapters.join(\", \");\n}\n","import {\n InMemoryStateAdapter,\n MercadoPagoClient,\n mercadoPagoTools,\n} from \"@ar-agents/mercadopago\";\nimport type { ToolSet } from \"ai\";\n\n/**\n * Build @ar-agents/mercadopago tools if MP_ACCESS_TOKEN is set.\n * Returns null when not configured.\n */\nexport function buildMercadoPagoTools(): ToolSet | null {\n const accessToken = process.env.MP_ACCESS_TOKEN?.trim();\n if (!accessToken) return null;\n const client = new MercadoPagoClient({ accessToken });\n const backUrl = process.env.MP_BACK_URL?.trim() ?? \"https://example.com/done\";\n return mercadoPagoTools(client, {\n state: new InMemoryStateAdapter(),\n backUrl,\n }) as ToolSet;\n}\n\nexport function describeMercadoPagoConfig(): string {\n const token = process.env.MP_ACCESS_TOKEN?.trim();\n if (!token) return \"not configured (set MP_ACCESS_TOKEN)\";\n const isTest = token.startsWith(\"TEST-\");\n const backUrl = process.env.MP_BACK_URL?.trim();\n return `${isTest ? \"TEST\" : \"PROD\"} mode${backUrl ? ` · back_url=${backUrl}` : \" · using default back_url\"}`;\n}\n","import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { combineToolSets } from \"./adapter\";\nimport { buildBankingTools, describeBankingConfig } from \"./registries/banking\";\nimport {\n buildFacturacionTools,\n describeFacturacionConfig,\n} from \"./registries/facturacion\";\nimport { buildIdentityTools, describeIdentityConfig } from \"./registries/identity\";\nimport {\n buildIdentityAttestTools,\n describeIdentityAttestConfig,\n} from \"./registries/identity-attest\";\nimport {\n buildMercadoPagoTools,\n describeMercadoPagoConfig,\n} from \"./registries/mercadopago\";\nimport { buildWhatsAppTools, describeWhatsAppConfig } from \"./registries/whatsapp\";\n\nconst SERVER_NAME = \"ar-agents\";\nconst SERVER_VERSION = \"0.3.0\";\n\n/**\n * Build the @ar-agents/mcp server. Inspects environment variables to decide\n * which package's tools to register. Always registers @ar-agents/identity\n * (algorithm-only `validate_cuit` works without any env vars).\n */\nexport async function createServer(): Promise<{ server: Server; summary: string[] }> {\n const adapter = combineToolSets([\n buildIdentityTools(),\n buildMercadoPagoTools(),\n buildWhatsAppTools(),\n buildIdentityAttestTools(),\n buildBankingTools(),\n buildFacturacionTools(),\n ]);\n\n const summary = [\n `${SERVER_NAME}@${SERVER_VERSION} starting with ${adapter.tools.length} tools registered:`,\n ` identity → ${describeIdentityConfig()}`,\n ` mercadopago → ${describeMercadoPagoConfig()}`,\n ` whatsapp → ${describeWhatsAppConfig()}`,\n ` identity-attest → ${describeIdentityAttestConfig()}`,\n ` banking → ${describeBankingConfig()}`,\n ` facturacion → ${describeFacturacionConfig()}`,\n ];\n\n const server = new Server(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {} } },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: adapter.tools,\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n try {\n const result = await adapter.call(name, args ?? {});\n return {\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: \"text\", text: `Error calling ${name}: ${msg}` }],\n isError: true,\n };\n }\n });\n\n return { server, summary };\n}\n\n/**\n * Start the MCP server over stdio. Called by the CLI binary.\n * Logs the registered-tools summary to stderr (stdout is reserved for MCP\n * protocol messages).\n */\nexport async function startStdio(): Promise<void> {\n const { server, summary } = await createServer();\n for (const line of summary) console.error(line);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(\"ar-agents MCP server connected via stdio\");\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -95,4 +95,27 @@ declare function describeIdentityAttestConfig(): string;
95
95
  declare function buildBankingTools(): ToolSet;
96
96
  declare function describeBankingConfig(): string;
97
97
 
98
- export { type McpAdapter, type McpTool, adaptToolSetToMcp, buildBankingTools, buildIdentityAttestTools, buildIdentityTools, buildMercadoPagoTools, buildWhatsAppTools, combineToolSets, createServer, describeBankingConfig, describeIdentityAttestConfig, describeIdentityConfig, describeMercadoPagoConfig, describeWhatsAppConfig, getWhatsAppClient, startStdio };
98
+ /**
99
+ * Build the @ar-agents/facturacion tool set from environment variables.
100
+ *
101
+ * AFIP cert + key + CUIT required (same as @ar-agents/identity, but the
102
+ * service must be authorized for `wsfe` in addition to whatever padron
103
+ * service identity uses). When the env vars are missing, the tools return
104
+ * `{ available: false, error: <setup instructions> }` instead of crashing —
105
+ * MCP host can show the user what to set.
106
+ *
107
+ * # Env vars
108
+ *
109
+ * - `AFIP_CUIT_REPRESENTADO` (required)
110
+ * - `AFIP_CERT_PEM` + `AFIP_KEY_PEM` (preferred for serverless / MCP) OR
111
+ * - `AFIP_CERT_PATH` + `AFIP_KEY_PATH` (for local dev)
112
+ * - `AFIP_ENV` — "homo" | "prod" (default "prod")
113
+ * - `WSFE_DEFAULT_PTOVTA` — default punto de venta (optional, recommended for
114
+ * single-PtoVta SaaS so agents don't have to remember it)
115
+ * - `WSFE_TIMEOUT_MS` — default 30000
116
+ * - `WSFE_MAX_RETRIES` — default 1
117
+ */
118
+ declare function buildFacturacionTools(): ToolSet;
119
+ declare function describeFacturacionConfig(): string;
120
+
121
+ export { type McpAdapter, type McpTool, adaptToolSetToMcp, buildBankingTools, buildFacturacionTools, buildIdentityAttestTools, buildIdentityTools, buildMercadoPagoTools, buildWhatsAppTools, combineToolSets, createServer, describeBankingConfig, describeFacturacionConfig, describeIdentityAttestConfig, describeIdentityConfig, describeMercadoPagoConfig, describeWhatsAppConfig, getWhatsAppClient, startStdio };
package/dist/index.d.ts CHANGED
@@ -95,4 +95,27 @@ declare function describeIdentityAttestConfig(): string;
95
95
  declare function buildBankingTools(): ToolSet;
96
96
  declare function describeBankingConfig(): string;
97
97
 
98
- export { type McpAdapter, type McpTool, adaptToolSetToMcp, buildBankingTools, buildIdentityAttestTools, buildIdentityTools, buildMercadoPagoTools, buildWhatsAppTools, combineToolSets, createServer, describeBankingConfig, describeIdentityAttestConfig, describeIdentityConfig, describeMercadoPagoConfig, describeWhatsAppConfig, getWhatsAppClient, startStdio };
98
+ /**
99
+ * Build the @ar-agents/facturacion tool set from environment variables.
100
+ *
101
+ * AFIP cert + key + CUIT required (same as @ar-agents/identity, but the
102
+ * service must be authorized for `wsfe` in addition to whatever padron
103
+ * service identity uses). When the env vars are missing, the tools return
104
+ * `{ available: false, error: <setup instructions> }` instead of crashing —
105
+ * MCP host can show the user what to set.
106
+ *
107
+ * # Env vars
108
+ *
109
+ * - `AFIP_CUIT_REPRESENTADO` (required)
110
+ * - `AFIP_CERT_PEM` + `AFIP_KEY_PEM` (preferred for serverless / MCP) OR
111
+ * - `AFIP_CERT_PATH` + `AFIP_KEY_PATH` (for local dev)
112
+ * - `AFIP_ENV` — "homo" | "prod" (default "prod")
113
+ * - `WSFE_DEFAULT_PTOVTA` — default punto de venta (optional, recommended for
114
+ * single-PtoVta SaaS so agents don't have to remember it)
115
+ * - `WSFE_TIMEOUT_MS` — default 30000
116
+ * - `WSFE_MAX_RETRIES` — default 1
117
+ */
118
+ declare function buildFacturacionTools(): ToolSet;
119
+ declare function describeFacturacionConfig(): string;
120
+
121
+ export { type McpAdapter, type McpTool, adaptToolSetToMcp, buildBankingTools, buildFacturacionTools, buildIdentityAttestTools, buildIdentityTools, buildMercadoPagoTools, buildWhatsAppTools, combineToolSets, createServer, describeBankingConfig, describeFacturacionConfig, describeIdentityAttestConfig, describeIdentityConfig, describeMercadoPagoConfig, describeWhatsAppConfig, getWhatsAppClient, startStdio };
package/dist/index.js CHANGED
@@ -3,6 +3,7 @@ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
3
3
  import { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';
4
4
  import { z } from 'zod';
5
5
  import { bankingTools, BcraPublicApiAdapter } from '@ar-agents/banking';
6
+ import { facturacionTools, WsfeClient } from '@ar-agents/facturacion';
6
7
  import { identityTools } from '@ar-agents/identity';
7
8
  import { WsaaWscdcAfipPadronAdapter } from '@ar-agents/identity/wsaa';
8
9
  import { WhatsAppOtpAdapter, EmailMagicLinkAdapter, AttestationClient, identityAttestTools } from '@ar-agents/identity-attest';
@@ -81,6 +82,57 @@ function describeBankingConfig() {
81
82
  const bcraDisabled = process.env.AR_AGENTS_BCRA_DISABLED?.trim() === "1";
82
83
  return bcraDisabled ? "validate_cbu, lookup_bank_by_code, list_banks, list_psps (BCRA disabled)" : "validate_cbu, lookup_bank_by_code, list_banks, list_psps, lookup_credit_situation (BCRA public API)";
83
84
  }
85
+ function buildFacturacionTools() {
86
+ const wsfe = buildWsfeClient();
87
+ const defaultPtoVta = Number(
88
+ process.env.WSFE_DEFAULT_PTOVTA?.trim() ?? "0"
89
+ );
90
+ const opts = {};
91
+ if (wsfe) opts.wsfe = wsfe;
92
+ if (Number.isFinite(defaultPtoVta) && defaultPtoVta > 0)
93
+ opts.defaultPtoVta = defaultPtoVta;
94
+ return facturacionTools(opts);
95
+ }
96
+ function buildWsfeClient() {
97
+ const cuit = process.env.AFIP_CUIT_REPRESENTADO?.trim();
98
+ if (!cuit) return void 0;
99
+ const env = process.env.AFIP_ENV?.trim() ?? "prod";
100
+ const timeout = Number(process.env.WSFE_TIMEOUT_MS?.trim() ?? "30000");
101
+ const retries = Number(process.env.WSFE_MAX_RETRIES?.trim() ?? "1");
102
+ const certPem = process.env.AFIP_CERT_PEM;
103
+ const keyPem = process.env.AFIP_KEY_PEM;
104
+ if (certPem && keyPem) {
105
+ return new WsfeClient({
106
+ certPem,
107
+ keyPem,
108
+ cuit,
109
+ env,
110
+ requestTimeoutMs: Number.isFinite(timeout) ? timeout : 3e4,
111
+ maxRetries: Number.isFinite(retries) ? retries : 1
112
+ });
113
+ }
114
+ const certPath = process.env.AFIP_CERT_PATH?.trim();
115
+ const keyPath = process.env.AFIP_KEY_PATH?.trim();
116
+ if (certPath && keyPath) {
117
+ return new WsfeClient({
118
+ certPath,
119
+ keyPath,
120
+ cuit,
121
+ env,
122
+ requestTimeoutMs: Number.isFinite(timeout) ? timeout : 3e4,
123
+ maxRetries: Number.isFinite(retries) ? retries : 1
124
+ });
125
+ }
126
+ return void 0;
127
+ }
128
+ function describeFacturacionConfig() {
129
+ const cuit = process.env.AFIP_CUIT_REPRESENTADO?.trim();
130
+ if (!cuit) return "no configurado (faltan AFIP_CUIT_REPRESENTADO + cert)";
131
+ const certConfigured = !!process.env.AFIP_CERT_PEM || !!process.env.AFIP_CERT_PATH;
132
+ if (!certConfigured) return "no configurado (falta AFIP_CERT_PEM o AFIP_CERT_PATH)";
133
+ const ptovta = process.env.WSFE_DEFAULT_PTOVTA?.trim();
134
+ return `WSFE habilitado (CUIT ${cuit}${ptovta ? `, PtoVta ${ptovta}` : ""})`;
135
+ }
84
136
  function buildIdentityTools() {
85
137
  const afip = buildAfipAdapter();
86
138
  return identityTools(afip ? { afip } : {});
@@ -197,14 +249,15 @@ function describeMercadoPagoConfig() {
197
249
 
198
250
  // src/server.ts
199
251
  var SERVER_NAME = "ar-agents";
200
- var SERVER_VERSION = "0.2.0";
252
+ var SERVER_VERSION = "0.3.0";
201
253
  async function createServer() {
202
254
  const adapter = combineToolSets([
203
255
  buildIdentityTools(),
204
256
  buildMercadoPagoTools(),
205
257
  buildWhatsAppTools(),
206
258
  buildIdentityAttestTools(),
207
- buildBankingTools()
259
+ buildBankingTools(),
260
+ buildFacturacionTools()
208
261
  ]);
209
262
  const summary = [
210
263
  `${SERVER_NAME}@${SERVER_VERSION} starting with ${adapter.tools.length} tools registered:`,
@@ -212,7 +265,8 @@ async function createServer() {
212
265
  ` mercadopago \u2192 ${describeMercadoPagoConfig()}`,
213
266
  ` whatsapp \u2192 ${describeWhatsAppConfig()}`,
214
267
  ` identity-attest \u2192 ${describeIdentityAttestConfig()}`,
215
- ` banking \u2192 ${describeBankingConfig()}`
268
+ ` banking \u2192 ${describeBankingConfig()}`,
269
+ ` facturacion \u2192 ${describeFacturacionConfig()}`
216
270
  ];
217
271
  const server = new Server(
218
272
  { name: SERVER_NAME, version: SERVER_VERSION },
@@ -246,6 +300,6 @@ async function startStdio() {
246
300
  console.error("ar-agents MCP server connected via stdio");
247
301
  }
248
302
 
249
- export { adaptToolSetToMcp, buildBankingTools, buildIdentityAttestTools, buildIdentityTools, buildMercadoPagoTools, buildWhatsAppTools, combineToolSets, createServer, describeBankingConfig, describeIdentityAttestConfig, describeIdentityConfig, describeMercadoPagoConfig, describeWhatsAppConfig, getWhatsAppClient, startStdio };
303
+ export { adaptToolSetToMcp, buildBankingTools, buildFacturacionTools, buildIdentityAttestTools, buildIdentityTools, buildMercadoPagoTools, buildWhatsAppTools, combineToolSets, createServer, describeBankingConfig, describeFacturacionConfig, describeIdentityAttestConfig, describeIdentityConfig, describeMercadoPagoConfig, describeWhatsAppConfig, getWhatsAppClient, startStdio };
250
304
  //# sourceMappingURL=index.js.map
251
305
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapter.ts","../src/registries/banking.ts","../src/registries/identity.ts","../src/registries/whatsapp.ts","../src/registries/identity-attest.ts","../src/registries/mercadopago.ts","../src/server.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { ToolSet } from \"ai\";\nimport { z } from \"zod\";\n\n/**\n * Convert a Vercel AI SDK ToolSet to MCP-compatible tool definitions.\n *\n * Vercel AI SDK's `tool()` shape:\n * { description, inputSchema: ZodSchema, execute: (args) => result }\n *\n * MCP's tool shape:\n * { name, description, inputSchema: JSONSchema }\n * + a separate handler that takes (name, args) and returns the result\n */\n\nexport interface McpTool {\n name: string;\n description: string;\n inputSchema: object; // JSON Schema\n}\n\nexport interface McpAdapter {\n /** All MCP tool definitions (for ListTools response). */\n tools: McpTool[];\n /** Handler for CallTool — looks up the original Vercel AI SDK tool and runs execute. */\n call: (name: string, args: unknown) => Promise<unknown>;\n}\n\n/**\n * Bridge a Vercel AI SDK ToolSet → MCP tools + dispatcher.\n *\n * Throws on unknown tool name or if execute is missing (safety: every Vercel\n * AI SDK tool ships with `execute` for server-side flows, which is what\n * MCP needs).\n */\nexport function adaptToolSetToMcp(toolSet: ToolSet): McpAdapter {\n const tools: McpTool[] = [];\n const lookup = new Map<string, (args: unknown) => Promise<unknown>>();\n\n for (const [name, tool] of Object.entries(toolSet)) {\n if (!tool || typeof tool !== \"object\") continue;\n const description =\n \"description\" in tool && typeof tool.description === \"string\" ? tool.description : \"\";\n const inputSchema =\n \"inputSchema\" in tool && tool.inputSchema\n ? (z.toJSONSchema(tool.inputSchema as z.ZodType) as object)\n : { type: \"object\", properties: {}, additionalProperties: false };\n\n tools.push({ name, description, inputSchema });\n\n const exec = \"execute\" in tool ? (tool.execute as (args: unknown) => Promise<unknown>) : null;\n if (!exec) {\n // Server-side execution required for MCP; skip tools without execute.\n continue;\n }\n lookup.set(name, exec);\n }\n\n return {\n tools,\n call: async (name, args) => {\n const fn = lookup.get(name);\n if (!fn) {\n throw new Error(`Tool \"${name}\" not found or has no execute fn (MCP requires server-side tools).`);\n }\n return fn(args);\n },\n };\n}\n\n/**\n * Combine multiple Vercel AI SDK ToolSets into a single McpAdapter. Tool\n * name collisions throw at adapter-build time.\n */\nexport function combineToolSets(toolSets: Array<ToolSet | null>): McpAdapter {\n const tools: McpTool[] = [];\n const lookup = new Map<string, (args: unknown) => Promise<unknown>>();\n const seen = new Set<string>();\n\n for (const ts of toolSets) {\n if (!ts) continue;\n const adapter = adaptToolSetToMcp(ts);\n for (const tool of adapter.tools) {\n if (seen.has(tool.name)) {\n throw new Error(\n `Tool name collision: \"${tool.name}\" appears in multiple registered tool sets. Rename one or skip a registry.`,\n );\n }\n seen.add(tool.name);\n tools.push(tool);\n // Bind this specific tool's call through the source adapter\n const sourceAdapter = adapter;\n const toolName = tool.name;\n lookup.set(toolName, (args: unknown) => sourceAdapter.call(toolName, args));\n }\n }\n\n return {\n tools,\n call: async (name, args) => {\n const fn = lookup.get(name);\n if (!fn) throw new Error(`Tool \"${name}\" not found in combined set.`);\n return fn(args);\n },\n };\n}\n","import {\n bankingTools,\n BcraPublicApiAdapter,\n type BcraDeudaAdapter,\n} from \"@ar-agents/banking\";\nimport type { ToolSet } from \"ai\";\n\n/**\n * Build the @ar-agents/banking tool set.\n *\n * Pure-algorithm tools (validate_cbu, lookup_bank_by_code, list_banks,\n * list_psps) are ALWAYS available — no env vars required.\n *\n * The BCRA Central de Deudores tool is wired to `BcraPublicApiAdapter`\n * by default (BCRA's public REST API needs no auth). To opt out, set\n * `AR_AGENTS_BCRA_DISABLED=1` in env — the tool then returns\n * `{ available: false, error: \"<setup instructions>\" }`.\n */\nexport function buildBankingTools(): ToolSet {\n const bcra = buildBcraAdapter();\n return bankingTools(bcra ? { bcra } : {}) as ToolSet;\n}\n\nfunction buildBcraAdapter(): BcraDeudaAdapter | undefined {\n if (process.env.AR_AGENTS_BCRA_DISABLED?.trim() === \"1\") return undefined;\n const timeout = Number(process.env.BCRA_TIMEOUT_MS?.trim() ?? \"30000\");\n const retries = Number(process.env.BCRA_MAX_RETRIES?.trim() ?? \"1\");\n return new BcraPublicApiAdapter({\n requestTimeoutMs: Number.isFinite(timeout) ? timeout : 30_000,\n maxRetries: Number.isFinite(retries) ? retries : 1,\n });\n}\n\nexport function describeBankingConfig(): string {\n const bcraDisabled = process.env.AR_AGENTS_BCRA_DISABLED?.trim() === \"1\";\n return bcraDisabled\n ? \"validate_cbu, lookup_bank_by_code, list_banks, list_psps (BCRA disabled)\"\n : \"validate_cbu, lookup_bank_by_code, list_banks, list_psps, lookup_credit_situation (BCRA public API)\";\n}\n","import { identityTools, type AfipPadronAdapter } from \"@ar-agents/identity\";\nimport { WsaaWscdcAfipPadronAdapter } from \"@ar-agents/identity/wsaa\";\nimport type { ToolSet } from \"ai\";\n\n/**\n * Build the @ar-agents/identity tool set from environment variables.\n * Returns null when AFIP env vars are missing (the algorithm-only `validate_cuit`\n * is always available; lookup_cuit_afip falls back to UnconfiguredAfipPadronAdapter).\n */\nexport function buildIdentityTools(): ToolSet {\n const afip = buildAfipAdapter();\n return identityTools(afip ? { afip } : {}) as ToolSet;\n}\n\nfunction buildAfipAdapter(): AfipPadronAdapter | undefined {\n const cuit = process.env.AFIP_CUIT_REPRESENTADO?.trim();\n if (!cuit) return undefined;\n const env = (process.env.AFIP_ENV?.trim() ?? \"prod\") as \"homo\" | \"prod\";\n const certPem = process.env.AFIP_CERT_PEM;\n const keyPem = process.env.AFIP_KEY_PEM;\n if (certPem && keyPem) {\n return new WsaaWscdcAfipPadronAdapter({ certPem, keyPem, cuitRepresentado: cuit, env });\n }\n const certPath = process.env.AFIP_CERT_PATH?.trim();\n const keyPath = process.env.AFIP_KEY_PATH?.trim();\n if (certPath && keyPath) {\n return new WsaaWscdcAfipPadronAdapter({ certPath, keyPath, cuitRepresentado: cuit, env });\n }\n return undefined;\n}\n\nexport function describeIdentityConfig(): string {\n const cuit = process.env.AFIP_CUIT_REPRESENTADO?.trim();\n if (!cuit) return \"validate_cuit only (no AFIP cert configured)\";\n const certConfigured =\n !!process.env.AFIP_CERT_PEM || !!process.env.AFIP_CERT_PATH;\n return certConfigured\n ? `validate_cuit + lookup_cuit_afip (AFIP cert configured for CUIT ${cuit})`\n : `validate_cuit only (cert not configured)`;\n}\n","import { WhatsAppClient, whatsappTools } from \"@ar-agents/whatsapp\";\nimport type { ToolSet } from \"ai\";\n\nexport function buildWhatsAppTools(): ToolSet | null {\n const accessToken = process.env.WA_ACCESS_TOKEN?.trim();\n const phoneNumberId = process.env.WA_PHONE_NUMBER_ID?.trim();\n if (!accessToken || !phoneNumberId) return null;\n return whatsappTools(new WhatsAppClient({ accessToken, phoneNumberId })) as ToolSet;\n}\n\nexport function describeWhatsAppConfig(): string {\n const accessToken = process.env.WA_ACCESS_TOKEN?.trim();\n const phoneNumberId = process.env.WA_PHONE_NUMBER_ID?.trim();\n if (!accessToken || !phoneNumberId)\n return \"not configured (set WA_ACCESS_TOKEN + WA_PHONE_NUMBER_ID)\";\n return `phone_number_id=${phoneNumberId.slice(0, 6)}…`;\n}\n\n/** Returns the configured client, used by identity-attest's WhatsAppOtpAdapter. */\nexport function getWhatsAppClient(): WhatsAppClient | null {\n const accessToken = process.env.WA_ACCESS_TOKEN?.trim();\n const phoneNumberId = process.env.WA_PHONE_NUMBER_ID?.trim();\n if (!accessToken || !phoneNumberId) return null;\n return new WhatsAppClient({ accessToken, phoneNumberId });\n}\n","import {\n AttestationClient,\n identityAttestTools,\n WhatsAppOtpAdapter,\n EmailMagicLinkAdapter,\n type EmailSender,\n} from \"@ar-agents/identity-attest\";\nimport type { ToolSet } from \"ai\";\nimport { getWhatsAppClient } from \"./whatsapp\";\n\n/**\n * Build @ar-agents/identity-attest tools if ATTEST_SIGNING_SECRET is set\n * and at least one adapter can be configured (WhatsApp client present\n * OR email sender configured via SMTP_URL / RESEND_API_KEY).\n */\nexport function buildIdentityAttestTools(): ToolSet | null {\n const signingSecret = process.env.ATTEST_SIGNING_SECRET?.trim();\n if (!signingSecret) return null;\n\n const adapters: Record<string, ConstructorParameters<typeof AttestationClient>[0][\"adapters\"][string]> = {};\n\n // WhatsApp OTP — requires WhatsApp client\n const wa = getWhatsAppClient();\n if (wa) {\n adapters[\"whatsapp_otp\"] = new WhatsAppOtpAdapter({\n whatsappClient: wa,\n businessName: process.env.BUSINESS_NAME?.trim() ?? \"this app\",\n });\n }\n\n // Email magic-link — requires Resend API key + callback URL\n const resendKey = process.env.RESEND_API_KEY?.trim();\n const callbackUrl = process.env.ATTEST_CALLBACK_URL?.trim();\n if (resendKey && callbackUrl) {\n const fromEmail = process.env.ATTEST_FROM_EMAIL?.trim() ?? \"noreply@example.com\";\n const sender: EmailSender = async ({ to, subject, html, text }) => {\n const res = await fetch(\"https://api.resend.com/emails\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${resendKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ from: fromEmail, to, subject, html, text }),\n });\n if (!res.ok) {\n throw new Error(`Resend send failed: ${res.status} ${await res.text()}`);\n }\n };\n adapters[\"email_magic_link\"] = new EmailMagicLinkAdapter({\n sender,\n callbackBaseUrl: callbackUrl,\n businessName: process.env.BUSINESS_NAME?.trim() ?? \"this app\",\n });\n }\n\n if (Object.keys(adapters).length === 0) return null;\n\n const client = new AttestationClient({ signingSecret, adapters });\n return identityAttestTools(client) as ToolSet;\n}\n\nexport function describeIdentityAttestConfig(): string {\n const signingSecret = process.env.ATTEST_SIGNING_SECRET?.trim();\n if (!signingSecret) return \"not configured (set ATTEST_SIGNING_SECRET)\";\n const adapters: string[] = [];\n if (getWhatsAppClient()) adapters.push(\"whatsapp_otp\");\n if (process.env.RESEND_API_KEY?.trim() && process.env.ATTEST_CALLBACK_URL?.trim())\n adapters.push(\"email_magic_link\");\n if (adapters.length === 0)\n return \"configured but no adapters (set WhatsApp creds and/or RESEND_API_KEY + ATTEST_CALLBACK_URL)\";\n return adapters.join(\", \");\n}\n","import {\n InMemoryStateAdapter,\n MercadoPagoClient,\n mercadoPagoTools,\n} from \"@ar-agents/mercadopago\";\nimport type { ToolSet } from \"ai\";\n\n/**\n * Build @ar-agents/mercadopago tools if MP_ACCESS_TOKEN is set.\n * Returns null when not configured.\n */\nexport function buildMercadoPagoTools(): ToolSet | null {\n const accessToken = process.env.MP_ACCESS_TOKEN?.trim();\n if (!accessToken) return null;\n const client = new MercadoPagoClient({ accessToken });\n const backUrl = process.env.MP_BACK_URL?.trim() ?? \"https://example.com/done\";\n return mercadoPagoTools(client, {\n state: new InMemoryStateAdapter(),\n backUrl,\n }) as ToolSet;\n}\n\nexport function describeMercadoPagoConfig(): string {\n const token = process.env.MP_ACCESS_TOKEN?.trim();\n if (!token) return \"not configured (set MP_ACCESS_TOKEN)\";\n const isTest = token.startsWith(\"TEST-\");\n const backUrl = process.env.MP_BACK_URL?.trim();\n return `${isTest ? \"TEST\" : \"PROD\"} mode${backUrl ? ` · back_url=${backUrl}` : \" · using default back_url\"}`;\n}\n","import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { combineToolSets } from \"./adapter\";\nimport { buildBankingTools, describeBankingConfig } from \"./registries/banking\";\nimport { buildIdentityTools, describeIdentityConfig } from \"./registries/identity\";\nimport {\n buildIdentityAttestTools,\n describeIdentityAttestConfig,\n} from \"./registries/identity-attest\";\nimport {\n buildMercadoPagoTools,\n describeMercadoPagoConfig,\n} from \"./registries/mercadopago\";\nimport { buildWhatsAppTools, describeWhatsAppConfig } from \"./registries/whatsapp\";\n\nconst SERVER_NAME = \"ar-agents\";\nconst SERVER_VERSION = \"0.2.0\";\n\n/**\n * Build the @ar-agents/mcp server. Inspects environment variables to decide\n * which package's tools to register. Always registers @ar-agents/identity\n * (algorithm-only `validate_cuit` works without any env vars).\n */\nexport async function createServer(): Promise<{ server: Server; summary: string[] }> {\n const adapter = combineToolSets([\n buildIdentityTools(),\n buildMercadoPagoTools(),\n buildWhatsAppTools(),\n buildIdentityAttestTools(),\n buildBankingTools(),\n ]);\n\n const summary = [\n `${SERVER_NAME}@${SERVER_VERSION} starting with ${adapter.tools.length} tools registered:`,\n ` identity → ${describeIdentityConfig()}`,\n ` mercadopago → ${describeMercadoPagoConfig()}`,\n ` whatsapp → ${describeWhatsAppConfig()}`,\n ` identity-attest → ${describeIdentityAttestConfig()}`,\n ` banking → ${describeBankingConfig()}`,\n ];\n\n const server = new Server(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {} } },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: adapter.tools,\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n try {\n const result = await adapter.call(name, args ?? {});\n return {\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: \"text\", text: `Error calling ${name}: ${msg}` }],\n isError: true,\n };\n }\n });\n\n return { server, summary };\n}\n\n/**\n * Start the MCP server over stdio. Called by the CLI binary.\n * Logs the registered-tools summary to stderr (stdout is reserved for MCP\n * protocol messages).\n */\nexport async function startStdio(): Promise<void> {\n const { server, summary } = await createServer();\n for (const line of summary) console.error(line);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(\"ar-agents MCP server connected via stdio\");\n}\n"]}
1
+ {"version":3,"sources":["../src/adapter.ts","../src/registries/banking.ts","../src/registries/facturacion.ts","../src/registries/identity.ts","../src/registries/whatsapp.ts","../src/registries/identity-attest.ts","../src/registries/mercadopago.ts","../src/server.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { ToolSet } from \"ai\";\nimport { z } from \"zod\";\n\n/**\n * Convert a Vercel AI SDK ToolSet to MCP-compatible tool definitions.\n *\n * Vercel AI SDK's `tool()` shape:\n * { description, inputSchema: ZodSchema, execute: (args) => result }\n *\n * MCP's tool shape:\n * { name, description, inputSchema: JSONSchema }\n * + a separate handler that takes (name, args) and returns the result\n */\n\nexport interface McpTool {\n name: string;\n description: string;\n inputSchema: object; // JSON Schema\n}\n\nexport interface McpAdapter {\n /** All MCP tool definitions (for ListTools response). */\n tools: McpTool[];\n /** Handler for CallTool — looks up the original Vercel AI SDK tool and runs execute. */\n call: (name: string, args: unknown) => Promise<unknown>;\n}\n\n/**\n * Bridge a Vercel AI SDK ToolSet → MCP tools + dispatcher.\n *\n * Throws on unknown tool name or if execute is missing (safety: every Vercel\n * AI SDK tool ships with `execute` for server-side flows, which is what\n * MCP needs).\n */\nexport function adaptToolSetToMcp(toolSet: ToolSet): McpAdapter {\n const tools: McpTool[] = [];\n const lookup = new Map<string, (args: unknown) => Promise<unknown>>();\n\n for (const [name, tool] of Object.entries(toolSet)) {\n if (!tool || typeof tool !== \"object\") continue;\n const description =\n \"description\" in tool && typeof tool.description === \"string\" ? tool.description : \"\";\n const inputSchema =\n \"inputSchema\" in tool && tool.inputSchema\n ? (z.toJSONSchema(tool.inputSchema as z.ZodType) as object)\n : { type: \"object\", properties: {}, additionalProperties: false };\n\n tools.push({ name, description, inputSchema });\n\n const exec = \"execute\" in tool ? (tool.execute as (args: unknown) => Promise<unknown>) : null;\n if (!exec) {\n // Server-side execution required for MCP; skip tools without execute.\n continue;\n }\n lookup.set(name, exec);\n }\n\n return {\n tools,\n call: async (name, args) => {\n const fn = lookup.get(name);\n if (!fn) {\n throw new Error(`Tool \"${name}\" not found or has no execute fn (MCP requires server-side tools).`);\n }\n return fn(args);\n },\n };\n}\n\n/**\n * Combine multiple Vercel AI SDK ToolSets into a single McpAdapter. Tool\n * name collisions throw at adapter-build time.\n */\nexport function combineToolSets(toolSets: Array<ToolSet | null>): McpAdapter {\n const tools: McpTool[] = [];\n const lookup = new Map<string, (args: unknown) => Promise<unknown>>();\n const seen = new Set<string>();\n\n for (const ts of toolSets) {\n if (!ts) continue;\n const adapter = adaptToolSetToMcp(ts);\n for (const tool of adapter.tools) {\n if (seen.has(tool.name)) {\n throw new Error(\n `Tool name collision: \"${tool.name}\" appears in multiple registered tool sets. Rename one or skip a registry.`,\n );\n }\n seen.add(tool.name);\n tools.push(tool);\n // Bind this specific tool's call through the source adapter\n const sourceAdapter = adapter;\n const toolName = tool.name;\n lookup.set(toolName, (args: unknown) => sourceAdapter.call(toolName, args));\n }\n }\n\n return {\n tools,\n call: async (name, args) => {\n const fn = lookup.get(name);\n if (!fn) throw new Error(`Tool \"${name}\" not found in combined set.`);\n return fn(args);\n },\n };\n}\n","import {\n bankingTools,\n BcraPublicApiAdapter,\n type BcraDeudaAdapter,\n} from \"@ar-agents/banking\";\nimport type { ToolSet } from \"ai\";\n\n/**\n * Build the @ar-agents/banking tool set.\n *\n * Pure-algorithm tools (validate_cbu, lookup_bank_by_code, list_banks,\n * list_psps) are ALWAYS available — no env vars required.\n *\n * The BCRA Central de Deudores tool is wired to `BcraPublicApiAdapter`\n * by default (BCRA's public REST API needs no auth). To opt out, set\n * `AR_AGENTS_BCRA_DISABLED=1` in env — the tool then returns\n * `{ available: false, error: \"<setup instructions>\" }`.\n */\nexport function buildBankingTools(): ToolSet {\n const bcra = buildBcraAdapter();\n return bankingTools(bcra ? { bcra } : {}) as ToolSet;\n}\n\nfunction buildBcraAdapter(): BcraDeudaAdapter | undefined {\n if (process.env.AR_AGENTS_BCRA_DISABLED?.trim() === \"1\") return undefined;\n const timeout = Number(process.env.BCRA_TIMEOUT_MS?.trim() ?? \"30000\");\n const retries = Number(process.env.BCRA_MAX_RETRIES?.trim() ?? \"1\");\n return new BcraPublicApiAdapter({\n requestTimeoutMs: Number.isFinite(timeout) ? timeout : 30_000,\n maxRetries: Number.isFinite(retries) ? retries : 1,\n });\n}\n\nexport function describeBankingConfig(): string {\n const bcraDisabled = process.env.AR_AGENTS_BCRA_DISABLED?.trim() === \"1\";\n return bcraDisabled\n ? \"validate_cbu, lookup_bank_by_code, list_banks, list_psps (BCRA disabled)\"\n : \"validate_cbu, lookup_bank_by_code, list_banks, list_psps, lookup_credit_situation (BCRA public API)\";\n}\n","import { facturacionTools, WsfeClient } from \"@ar-agents/facturacion\";\nimport type { ToolSet } from \"ai\";\n\n/**\n * Build the @ar-agents/facturacion tool set from environment variables.\n *\n * AFIP cert + key + CUIT required (same as @ar-agents/identity, but the\n * service must be authorized for `wsfe` in addition to whatever padron\n * service identity uses). When the env vars are missing, the tools return\n * `{ available: false, error: <setup instructions> }` instead of crashing —\n * MCP host can show the user what to set.\n *\n * # Env vars\n *\n * - `AFIP_CUIT_REPRESENTADO` (required)\n * - `AFIP_CERT_PEM` + `AFIP_KEY_PEM` (preferred for serverless / MCP) OR\n * - `AFIP_CERT_PATH` + `AFIP_KEY_PATH` (for local dev)\n * - `AFIP_ENV` — \"homo\" | \"prod\" (default \"prod\")\n * - `WSFE_DEFAULT_PTOVTA` — default punto de venta (optional, recommended for\n * single-PtoVta SaaS so agents don't have to remember it)\n * - `WSFE_TIMEOUT_MS` — default 30000\n * - `WSFE_MAX_RETRIES` — default 1\n */\nexport function buildFacturacionTools(): ToolSet {\n const wsfe = buildWsfeClient();\n const defaultPtoVta = Number(\n process.env.WSFE_DEFAULT_PTOVTA?.trim() ?? \"0\",\n );\n const opts: Parameters<typeof facturacionTools>[0] = {};\n if (wsfe) opts.wsfe = wsfe;\n if (Number.isFinite(defaultPtoVta) && defaultPtoVta > 0)\n opts.defaultPtoVta = defaultPtoVta;\n return facturacionTools(opts) as ToolSet;\n}\n\nfunction buildWsfeClient(): WsfeClient | undefined {\n const cuit = process.env.AFIP_CUIT_REPRESENTADO?.trim();\n if (!cuit) return undefined;\n const env = (process.env.AFIP_ENV?.trim() ?? \"prod\") as \"homo\" | \"prod\";\n const timeout = Number(process.env.WSFE_TIMEOUT_MS?.trim() ?? \"30000\");\n const retries = Number(process.env.WSFE_MAX_RETRIES?.trim() ?? \"1\");\n const certPem = process.env.AFIP_CERT_PEM;\n const keyPem = process.env.AFIP_KEY_PEM;\n if (certPem && keyPem) {\n return new WsfeClient({\n certPem,\n keyPem,\n cuit,\n env,\n requestTimeoutMs: Number.isFinite(timeout) ? timeout : 30_000,\n maxRetries: Number.isFinite(retries) ? retries : 1,\n });\n }\n const certPath = process.env.AFIP_CERT_PATH?.trim();\n const keyPath = process.env.AFIP_KEY_PATH?.trim();\n if (certPath && keyPath) {\n return new WsfeClient({\n certPath,\n keyPath,\n cuit,\n env,\n requestTimeoutMs: Number.isFinite(timeout) ? timeout : 30_000,\n maxRetries: Number.isFinite(retries) ? retries : 1,\n });\n }\n return undefined;\n}\n\nexport function describeFacturacionConfig(): string {\n const cuit = process.env.AFIP_CUIT_REPRESENTADO?.trim();\n if (!cuit) return \"no configurado (faltan AFIP_CUIT_REPRESENTADO + cert)\";\n const certConfigured =\n !!process.env.AFIP_CERT_PEM || !!process.env.AFIP_CERT_PATH;\n if (!certConfigured) return \"no configurado (falta AFIP_CERT_PEM o AFIP_CERT_PATH)\";\n const ptovta = process.env.WSFE_DEFAULT_PTOVTA?.trim();\n return `WSFE habilitado (CUIT ${cuit}${ptovta ? `, PtoVta ${ptovta}` : \"\"})`;\n}\n","import { identityTools, type AfipPadronAdapter } from \"@ar-agents/identity\";\nimport { WsaaWscdcAfipPadronAdapter } from \"@ar-agents/identity/wsaa\";\nimport type { ToolSet } from \"ai\";\n\n/**\n * Build the @ar-agents/identity tool set from environment variables.\n * Returns null when AFIP env vars are missing (the algorithm-only `validate_cuit`\n * is always available; lookup_cuit_afip falls back to UnconfiguredAfipPadronAdapter).\n */\nexport function buildIdentityTools(): ToolSet {\n const afip = buildAfipAdapter();\n return identityTools(afip ? { afip } : {}) as ToolSet;\n}\n\nfunction buildAfipAdapter(): AfipPadronAdapter | undefined {\n const cuit = process.env.AFIP_CUIT_REPRESENTADO?.trim();\n if (!cuit) return undefined;\n const env = (process.env.AFIP_ENV?.trim() ?? \"prod\") as \"homo\" | \"prod\";\n const certPem = process.env.AFIP_CERT_PEM;\n const keyPem = process.env.AFIP_KEY_PEM;\n if (certPem && keyPem) {\n return new WsaaWscdcAfipPadronAdapter({ certPem, keyPem, cuitRepresentado: cuit, env });\n }\n const certPath = process.env.AFIP_CERT_PATH?.trim();\n const keyPath = process.env.AFIP_KEY_PATH?.trim();\n if (certPath && keyPath) {\n return new WsaaWscdcAfipPadronAdapter({ certPath, keyPath, cuitRepresentado: cuit, env });\n }\n return undefined;\n}\n\nexport function describeIdentityConfig(): string {\n const cuit = process.env.AFIP_CUIT_REPRESENTADO?.trim();\n if (!cuit) return \"validate_cuit only (no AFIP cert configured)\";\n const certConfigured =\n !!process.env.AFIP_CERT_PEM || !!process.env.AFIP_CERT_PATH;\n return certConfigured\n ? `validate_cuit + lookup_cuit_afip (AFIP cert configured for CUIT ${cuit})`\n : `validate_cuit only (cert not configured)`;\n}\n","import { WhatsAppClient, whatsappTools } from \"@ar-agents/whatsapp\";\nimport type { ToolSet } from \"ai\";\n\nexport function buildWhatsAppTools(): ToolSet | null {\n const accessToken = process.env.WA_ACCESS_TOKEN?.trim();\n const phoneNumberId = process.env.WA_PHONE_NUMBER_ID?.trim();\n if (!accessToken || !phoneNumberId) return null;\n return whatsappTools(new WhatsAppClient({ accessToken, phoneNumberId })) as ToolSet;\n}\n\nexport function describeWhatsAppConfig(): string {\n const accessToken = process.env.WA_ACCESS_TOKEN?.trim();\n const phoneNumberId = process.env.WA_PHONE_NUMBER_ID?.trim();\n if (!accessToken || !phoneNumberId)\n return \"not configured (set WA_ACCESS_TOKEN + WA_PHONE_NUMBER_ID)\";\n return `phone_number_id=${phoneNumberId.slice(0, 6)}…`;\n}\n\n/** Returns the configured client, used by identity-attest's WhatsAppOtpAdapter. */\nexport function getWhatsAppClient(): WhatsAppClient | null {\n const accessToken = process.env.WA_ACCESS_TOKEN?.trim();\n const phoneNumberId = process.env.WA_PHONE_NUMBER_ID?.trim();\n if (!accessToken || !phoneNumberId) return null;\n return new WhatsAppClient({ accessToken, phoneNumberId });\n}\n","import {\n AttestationClient,\n identityAttestTools,\n WhatsAppOtpAdapter,\n EmailMagicLinkAdapter,\n type EmailSender,\n} from \"@ar-agents/identity-attest\";\nimport type { ToolSet } from \"ai\";\nimport { getWhatsAppClient } from \"./whatsapp\";\n\n/**\n * Build @ar-agents/identity-attest tools if ATTEST_SIGNING_SECRET is set\n * and at least one adapter can be configured (WhatsApp client present\n * OR email sender configured via SMTP_URL / RESEND_API_KEY).\n */\nexport function buildIdentityAttestTools(): ToolSet | null {\n const signingSecret = process.env.ATTEST_SIGNING_SECRET?.trim();\n if (!signingSecret) return null;\n\n const adapters: Record<string, ConstructorParameters<typeof AttestationClient>[0][\"adapters\"][string]> = {};\n\n // WhatsApp OTP — requires WhatsApp client\n const wa = getWhatsAppClient();\n if (wa) {\n adapters[\"whatsapp_otp\"] = new WhatsAppOtpAdapter({\n whatsappClient: wa,\n businessName: process.env.BUSINESS_NAME?.trim() ?? \"this app\",\n });\n }\n\n // Email magic-link — requires Resend API key + callback URL\n const resendKey = process.env.RESEND_API_KEY?.trim();\n const callbackUrl = process.env.ATTEST_CALLBACK_URL?.trim();\n if (resendKey && callbackUrl) {\n const fromEmail = process.env.ATTEST_FROM_EMAIL?.trim() ?? \"noreply@example.com\";\n const sender: EmailSender = async ({ to, subject, html, text }) => {\n const res = await fetch(\"https://api.resend.com/emails\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${resendKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ from: fromEmail, to, subject, html, text }),\n });\n if (!res.ok) {\n throw new Error(`Resend send failed: ${res.status} ${await res.text()}`);\n }\n };\n adapters[\"email_magic_link\"] = new EmailMagicLinkAdapter({\n sender,\n callbackBaseUrl: callbackUrl,\n businessName: process.env.BUSINESS_NAME?.trim() ?? \"this app\",\n });\n }\n\n if (Object.keys(adapters).length === 0) return null;\n\n const client = new AttestationClient({ signingSecret, adapters });\n return identityAttestTools(client) as ToolSet;\n}\n\nexport function describeIdentityAttestConfig(): string {\n const signingSecret = process.env.ATTEST_SIGNING_SECRET?.trim();\n if (!signingSecret) return \"not configured (set ATTEST_SIGNING_SECRET)\";\n const adapters: string[] = [];\n if (getWhatsAppClient()) adapters.push(\"whatsapp_otp\");\n if (process.env.RESEND_API_KEY?.trim() && process.env.ATTEST_CALLBACK_URL?.trim())\n adapters.push(\"email_magic_link\");\n if (adapters.length === 0)\n return \"configured but no adapters (set WhatsApp creds and/or RESEND_API_KEY + ATTEST_CALLBACK_URL)\";\n return adapters.join(\", \");\n}\n","import {\n InMemoryStateAdapter,\n MercadoPagoClient,\n mercadoPagoTools,\n} from \"@ar-agents/mercadopago\";\nimport type { ToolSet } from \"ai\";\n\n/**\n * Build @ar-agents/mercadopago tools if MP_ACCESS_TOKEN is set.\n * Returns null when not configured.\n */\nexport function buildMercadoPagoTools(): ToolSet | null {\n const accessToken = process.env.MP_ACCESS_TOKEN?.trim();\n if (!accessToken) return null;\n const client = new MercadoPagoClient({ accessToken });\n const backUrl = process.env.MP_BACK_URL?.trim() ?? \"https://example.com/done\";\n return mercadoPagoTools(client, {\n state: new InMemoryStateAdapter(),\n backUrl,\n }) as ToolSet;\n}\n\nexport function describeMercadoPagoConfig(): string {\n const token = process.env.MP_ACCESS_TOKEN?.trim();\n if (!token) return \"not configured (set MP_ACCESS_TOKEN)\";\n const isTest = token.startsWith(\"TEST-\");\n const backUrl = process.env.MP_BACK_URL?.trim();\n return `${isTest ? \"TEST\" : \"PROD\"} mode${backUrl ? ` · back_url=${backUrl}` : \" · using default back_url\"}`;\n}\n","import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { combineToolSets } from \"./adapter\";\nimport { buildBankingTools, describeBankingConfig } from \"./registries/banking\";\nimport {\n buildFacturacionTools,\n describeFacturacionConfig,\n} from \"./registries/facturacion\";\nimport { buildIdentityTools, describeIdentityConfig } from \"./registries/identity\";\nimport {\n buildIdentityAttestTools,\n describeIdentityAttestConfig,\n} from \"./registries/identity-attest\";\nimport {\n buildMercadoPagoTools,\n describeMercadoPagoConfig,\n} from \"./registries/mercadopago\";\nimport { buildWhatsAppTools, describeWhatsAppConfig } from \"./registries/whatsapp\";\n\nconst SERVER_NAME = \"ar-agents\";\nconst SERVER_VERSION = \"0.3.0\";\n\n/**\n * Build the @ar-agents/mcp server. Inspects environment variables to decide\n * which package's tools to register. Always registers @ar-agents/identity\n * (algorithm-only `validate_cuit` works without any env vars).\n */\nexport async function createServer(): Promise<{ server: Server; summary: string[] }> {\n const adapter = combineToolSets([\n buildIdentityTools(),\n buildMercadoPagoTools(),\n buildWhatsAppTools(),\n buildIdentityAttestTools(),\n buildBankingTools(),\n buildFacturacionTools(),\n ]);\n\n const summary = [\n `${SERVER_NAME}@${SERVER_VERSION} starting with ${adapter.tools.length} tools registered:`,\n ` identity → ${describeIdentityConfig()}`,\n ` mercadopago → ${describeMercadoPagoConfig()}`,\n ` whatsapp → ${describeWhatsAppConfig()}`,\n ` identity-attest → ${describeIdentityAttestConfig()}`,\n ` banking → ${describeBankingConfig()}`,\n ` facturacion → ${describeFacturacionConfig()}`,\n ];\n\n const server = new Server(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {} } },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: adapter.tools,\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n try {\n const result = await adapter.call(name, args ?? {});\n return {\n content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }],\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: \"text\", text: `Error calling ${name}: ${msg}` }],\n isError: true,\n };\n }\n });\n\n return { server, summary };\n}\n\n/**\n * Start the MCP server over stdio. Called by the CLI binary.\n * Logs the registered-tools summary to stderr (stdout is reserved for MCP\n * protocol messages).\n */\nexport async function startStdio(): Promise<void> {\n const { server, summary } = await createServer();\n for (const line of summary) console.error(line);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(\"ar-agents MCP server connected via stdio\");\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ar-agents/mcp",
3
- "version": "0.2.0",
4
- "description": "MCP (Model Context Protocol) server that exposes the entire @ar-agents/* toolkit (identity, identity-attest, mercadopago, whatsapp, banking) to any MCP host (Claude Desktop, Cursor, Codeium, etc.). One install, one config, all AR integrations.",
3
+ "version": "0.3.0",
4
+ "description": "MCP (Model Context Protocol) server that exposes the entire @ar-agents/* toolkit (identity, identity-attest, mercadopago, whatsapp, banking, facturacion) to any MCP host (Claude Desktop, Cursor, Codeium, etc.). One install, one config, all AR integrations.",
5
5
  "keywords": [
6
6
  "mcp",
7
7
  "model-context-protocol",
@@ -10,11 +10,15 @@
10
10
  "ar-agents",
11
11
  "argentina",
12
12
  "afip",
13
+ "arca",
13
14
  "mercadopago",
14
15
  "whatsapp",
15
16
  "banking",
16
17
  "cbu",
17
- "bcra"
18
+ "bcra",
19
+ "facturacion",
20
+ "wsfe",
21
+ "factura-electronica"
18
22
  ],
19
23
  "license": "MIT",
20
24
  "author": "Nazareno Clemente <naza@helloastro.co>",
@@ -89,6 +93,7 @@
89
93
  ],
90
94
  "dependencies": {
91
95
  "@ar-agents/banking": "workspace:*",
96
+ "@ar-agents/facturacion": "workspace:*",
92
97
  "@ar-agents/identity": "workspace:*",
93
98
  "@ar-agents/identity-attest": "workspace:*",
94
99
  "@ar-agents/mercadopago": "workspace:*",